揭秘C#连接Oracle数据库的终极指南:从入门到精通,一步到位
发布时间: 2024-07-24 18:51:45 阅读量: 117 订阅数: 43
![Oracle数据库](https://img-blog.csdnimg.cn/20210317135757407.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI4NzIxODY5,size_16,color_FFFFFF,t_70)
# 1. C#连接Oracle数据库基础
C#连接Oracle数据库是通过.NET Framework中提供的Oracle.ManagedDataAccess.Client命名空间实现的。该命名空间提供了连接Oracle数据库所需的所有类和方法。
### 1.1 OracleConnection类
OracleConnection类表示与Oracle数据库的连接。它提供了打开、关闭和管理数据库连接的方法。OracleConnection类的构造函数如下:
```csharp
public OracleConnection(string connectionString);
```
其中,connectionString参数指定连接到Oracle数据库所需的连接字符串。
# 2. C#连接Oracle数据库编程技巧
### 2.1 OracleConnection类和连接字符串
#### 2.1.1 OracleConnection类的构造函数
`OracleConnection`类用于建立与Oracle数据库的连接,其构造函数如下:
```csharp
public OracleConnection(string connectionString);
```
**参数说明:**
* `connectionString`:连接字符串,指定连接到Oracle数据库所需的信息。
#### 2.1.2 连接字符串的格式和参数
连接字符串用于指定连接到Oracle数据库所需的信息,其格式如下:
```
Data Source=<server_name>;User Id=<user_name>;Password=<password>;
```
**参数说明:**
* `Data Source`:Oracle数据库服务器的名称或IP地址。
* `User Id`:连接到Oracle数据库的用户名。
* `Password`:连接到Oracle数据库的密码。
### 2.2 OracleCommand类和参数化查询
#### 2.2.1 OracleCommand类的构造函数
`OracleCommand`类用于执行Oracle数据库中的命令,其构造函数如下:
```csharp
public OracleCommand(string commandText, OracleConnection connection);
```
**参数说明:**
* `commandText`:要执行的SQL语句或存储过程名称。
* `connection`:与Oracle数据库的连接。
#### 2.2.2 参数化查询的优点和用法
参数化查询是一种安全高效的执行SQL语句的方法,其优点包括:
* **防止SQL注入攻击:**参数化查询将参数与SQL语句分开,防止恶意用户通过参数注入SQL代码。
* **提高性能:**参数化查询可以提高性能,因为Oracle数据库可以预编译SQL语句并将其存储在缓存中。
**用法:**
```csharp
// 创建OracleCommand对象
OracleCommand command = new OracleCommand("SELECT * FROM employees WHERE employee_id = :id", connection);
// 添加参数
command.Parameters.Add("id", OracleDbType.Int32).Value = 10;
// 执行查询
OracleDataReader reader = command.ExecuteReader();
```
### 2.3 OracleDataReader类和结果集处理
#### 2.3.1 OracleDataReader类的构造函数
`OracleDataReader`类用于读取Oracle数据库查询的结果集,其构造函数如下:
```csharp
public OracleDataReader(OracleCommand command);
```
**参数说明:**
* `command`:执行查询的`OracleCommand`对象。
#### 2.3.2 结果集的遍历和数据获取
**遍历结果集:**
```csharp
while (reader.Read())
{
// 获取当前行的列值
}
```
**获取数据:**
```csharp
// 获取指定列名的值
string name = reader.GetString("name");
// 获取指定列索引的值
int age = reader.GetInt32(1);
```
# 3.1 增删改查(CRUD)操作
在实际应用中,连接Oracle数据库最常见的操作就是增删改查(CRUD)操作。下面将详细介绍如何使用C#代码实现这些操作。
#### 3.1.1 插入数据到Oracle表
插入数据到Oracle表,需要使用OracleCommand类的ExecuteNonQuery()方法。该方法返回受影响的行数,如果插入成功,则返回1。
```csharp
// 创建OracleCommand对象
OracleCommand cmd = new OracleCommand();
cmd.Connection = connection;
cmd.CommandText = "INSERT INTO employees (employee_id, first_name, last_name) VALUES (:id, :fname, :lname)";
// 添加参数
cmd.Parameters.Add(new OracleParameter(":id", OracleDbType.Int32) { Value = 1001 });
cmd.Parameters.Add(new OracleParameter(":fname", OracleDbType.VarChar) { Value = "John" });
cmd.Parameters.Add(new OracleParameter(":lname", OracleDbType.VarChar) { Value = "Doe" });
// 执行命令
int rowsAffected = cmd.ExecuteNonQuery();
```
#### 3.1.2 更新Oracle表中的数据
更新Oracle表中的数据,也需要使用OracleCommand类的ExecuteNonQuery()方法。该方法返回受影响的行数,如果更新成功,则返回1。
```csharp
// 创建OracleCommand对象
OracleCommand cmd = new OracleCommand();
cmd.Connection = connection;
cmd.CommandText = "UPDATE employees SET first_name = :fname WHERE employee_id = :id";
// 添加参数
cmd.Parameters.Add(new OracleParameter(":id", OracleDbType.Int32) { Value = 1001 });
cmd.Parameters.Add(new OracleParameter(":fname", OracleDbType.VarChar) { Value = "John" });
// 执行命令
int rowsAffected = cmd.ExecuteNonQuery();
```
#### 3.1.3 删除Oracle表中的数据
删除Oracle表中的数据,需要使用OracleCommand类的ExecuteNonQuery()方法。该方法返回受影响的行数,如果删除成功,则返回1。
```csharp
// 创建OracleCommand对象
OracleCommand cmd = new OracleCommand();
cmd.Connection = connection;
cmd.CommandText = "DELETE FROM employees WHERE employee_id = :id";
// 添加参数
cmd.Parameters.Add(new OracleParameter(":id", OracleDbType.Int32) { Value = 1001 });
// 执行命令
int rowsAffected = cmd.ExecuteNonQuery();
```
#### 3.1.4 查询Oracle表中的数据
查询Oracle表中的数据,需要使用OracleCommand类的ExecuteReader()方法。该方法返回一个OracleDataReader对象,其中包含查询结果。
```csharp
// 创建OracleCommand对象
OracleCommand cmd = new OracleCommand();
cmd.Connection = connection;
cmd.CommandText = "SELECT * FROM employees";
// 执行命令
OracleDataReader reader = cmd.ExecuteReader();
// 遍历结果集
while (reader.Read())
{
Console.WriteLine("{0} {1} {2}", reader["employee_id"], reader["first_name"], reader["last_name"]);
}
// 关闭DataReader
reader.Close();
```
# 4.1 Oracle存储过程和函数
### 4.1.1 存储过程的创建和调用
**存储过程**是存储在数据库中的一组预编译的SQL语句,可以作为单个单元执行。它可以接受输入参数,并返回输出参数或结果集。存储过程提供了以下优点:
- **代码重用:**存储过程可以将常用的SQL语句封装成一个单元,方便重用,避免重复编写相同的代码。
- **性能优化:**存储过程在数据库服务器上执行,可以减少网络开销和提高性能。
- **安全控制:**存储过程可以设置权限,控制对数据的访问。
**创建存储过程**
```sql
CREATE PROCEDURE GetCustomerOrders
(
@CustomerID int
)
AS
BEGIN
SELECT * FROM Orders WHERE CustomerID = @CustomerID;
END;
```
**调用存储过程**
```csharp
using Oracle.ManagedDataAccess.Client;
// 创建OracleConnection对象
using (OracleConnection conn = new OracleConnection(connectionString))
{
// 创建OracleCommand对象
using (OracleCommand cmd = new OracleCommand("GetCustomerOrders", conn))
{
// 设置存储过程参数
cmd.Parameters.Add("CustomerID", OracleDbType.Int32).Value = customerID;
// 打开连接
conn.Open();
// 执行存储过程
using (OracleDataReader reader = cmd.ExecuteReader())
{
// 处理结果集
while (reader.Read())
{
Console.WriteLine($"Order ID: {reader["OrderID"]}");
Console.WriteLine($"Product Name: {reader["ProductName"]}");
Console.WriteLine($"Quantity: {reader["Quantity"]}");
}
}
}
}
```
### 4.1.2 函数的创建和调用
**函数**与存储过程类似,但它返回一个标量值,而不是结果集。函数可以接受输入参数,并返回一个指定数据类型的标量值。
**创建函数**
```sql
CREATE FUNCTION GetCustomerName
(
@CustomerID int
)
RETURNS VARCHAR2
AS
BEGIN
DECLARE customerName VARCHAR2(100);
SELECT CustomerName INTO customerName FROM Customers WHERE CustomerID = @CustomerID;
RETURN customerName;
END;
```
**调用函数**
```csharp
using Oracle.ManagedDataAccess.Client;
// 创建OracleConnection对象
using (OracleConnection conn = new OracleConnection(connectionString))
{
// 创建OracleCommand对象
using (OracleCommand cmd = new OracleCommand("GetCustomerName", conn))
{
// 设置函数参数
cmd.Parameters.Add("CustomerID", OracleDbType.Int32).Value = customerID;
// 打开连接
conn.Open();
// 执行函数
string customerName = (string)cmd.ExecuteScalar();
Console.WriteLine($"Customer Name: {customerName}");
}
}
```
# 5.1 连接池和连接管理
### 5.1.1 连接池的原理和配置
连接池是一种用来管理数据库连接的机制,它可以提高应用程序的性能和可伸缩性。连接池通过维护一个预先配置的可用连接池来工作,当应用程序需要连接数据库时,它可以从池中获取一个连接,而不是每次都创建一个新的连接。
在 .NET 中,可以使用 `OracleConnectionStringBuilder` 类来配置连接池。以下代码示例演示了如何配置连接池:
```csharp
OracleConnectionStringBuilder connectionStringBuilder = new OracleConnectionStringBuilder();
connectionStringBuilder.Pooling = true;
connectionStringBuilder.MaxPoolSize = 10;
connectionStringBuilder.MinPoolSize = 5;
```
* `Pooling` 属性指定是否启用连接池。
* `MaxPoolSize` 属性指定池中允许的最大连接数。
* `MinPoolSize` 属性指定池中允许的最小连接数。
### 5.1.2 连接管理的策略和技巧
除了使用连接池之外,还可以通过以下策略和技巧来管理连接:
* **使用连接池**:连接池可以帮助减少创建和销毁连接的开销,从而提高性能。
* **使用连接复用**:如果可能,请尝试复用连接,而不是每次都创建新的连接。
* **及时关闭连接**:使用完连接后,请及时关闭连接以释放资源。
* **监控连接使用情况**:监控连接的使用情况以识别潜在问题,例如连接泄漏或连接不足。
* **使用连接池管理器**:连接池管理器可以帮助管理连接池并提供高级功能,例如故障转移和负载平衡。
0
0