Oracle存储过程与C#调用指南:掌握存储过程与C#之间的调用方式
发布时间: 2024-07-25 22:46:41 阅读量: 58 订阅数: 49
![oracle数据库的存储过程](https://img-blog.csdnimg.cn/6bc4b5106b14460bb6e0e06265bbbd4c.png)
# 1. Oracle存储过程基础
存储过程是Oracle数据库中一种预编译的SQL语句块,它将一组相关的SQL语句封装在一起,并赋予一个名称。存储过程可以接受输入参数,执行复杂的操作,并返回结果。
使用存储过程的主要优点包括:
- **代码重用:**存储过程可以被多次调用,从而减少重复代码的编写。
- **提高性能:**存储过程在数据库服务器上预编译,这比每次执行单个SQL语句都要快。
- **封装复杂逻辑:**存储过程可以封装复杂的SQL逻辑,使其更容易维护和理解。
# 2. C#与Oracle存储过程交互
### 2.1 OracleCommand类与参数传递
#### 2.1.1 OracleCommand类的基本使用
OracleCommand类是C#中用于执行Oracle存储过程和SQL语句的类。它提供了对Oracle数据库的命令执行功能,包括参数设置、结果集获取等。
创建OracleCommand对象并指定要执行的存储过程或SQL语句:
```csharp
using Oracle.ManagedDataAccess.Client;
OracleConnection connection = new OracleConnection("Data Source=localhost:1521/orcl;User Id=scott;Password=tiger;");
OracleCommand command = new OracleCommand("GetCustomer", connection);
command.CommandType = CommandType.StoredProcedure;
```
#### 2.1.2 参数的类型和传递方式
OracleCommand类支持多种参数类型,包括输入、输出和输入/输出参数。参数的类型和传递方式通过OracleParameter类指定。
| 参数类型 | 传递方式 |
|---|---|
| Input | 通过OracleParameter.Value属性设置参数值 |
| Output | 通过OracleParameter.Direction属性设置为Output,并通过OracleParameter.Value属性获取输出值 |
| InputOutput | 通过OracleParameter.Direction属性设置为InputOutput,并通过OracleParameter.Value属性设置和获取参数值 |
设置参数值:
```csharp
OracleParameter param = new OracleParameter("p_name", OracleDbType.Varchar2);
param.Value = "John Doe";
command.Parameters.Add(param);
```
### 2.2 存储过程的执行和结果处理
#### 2.2.1 存储过程的调用方法
执行存储过程有两种方法:ExecuteNonQuery()和ExecuteReader()。
* ExecuteNonQuery():用于执行不返回结果集的存储过程,如更新、删除等操作。
* ExecuteReader():用于执行返回结果集的存储过程,如查询操作。
```csharp
// 执行不返回结果集的存储过程
int rowCount = command.ExecuteNonQuery();
// 执行返回结果集的存储过程
OracleDataReader reader = command.ExecuteReader();
```
#### 2.2.2 结果集的获取和遍历
ExecuteReader()方法返回一个OracleDataReader对象,用于遍历结果集。
```csharp
while (reader.Read())
{
string name = reader.GetString(0);
int age = reader.GetInt32(1);
}
```
### 2.3 事务处理和异常处理
#### 2.3.1 事务管理的基本概念
事务是一组原子操作,要么全部成功,要么全部失败。OracleCommand类支持事务管理,通过OracleTransaction类实现。
创建事务:
```csharp
OracleTransaction transaction = connection.BeginTransaction();
```
提交事务:
```csharp
transaction.Commit();
```
回滚事务:
```csharp
transaction.Rollback();
```
#### 2.3.2 异常处理机制
OracleCommand类提供了异常处理机制,通过OracleException类捕获数据库操作中的异常。
```csharp
try
{
command.ExecuteNonQuery();
}
catch (OracleException ex)
{
// 处理异常
}
```
# 3.1 数据查询和更新操作
#### 3.1.1 查询存储过程的执行
**查询存储过程的调用方法**
```csharp
using Oracle.ManagedDataAccess.Client;
namespace OracleStoredProcedureDemo
{
public class QueryStoredProcedure
{
public static void Main(string[] args)
{
// 连接字符串
string connectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)));User Id=scott;Password=tiger;";
// 创建连接对象
using (OracleConnection connection = new OracleConnection(connectionString))
{
// 创建命令对象
using (OracleCommand command = connection.CreateCommand())
{
// 设置命令类型为存储过程
command.CommandType = CommandType.StoredProcedure;
// 设置存储过程名称
command.CommandText = "GET_EMPLOYEES";
// 打开连接
connection.Open();
// 执行存储过程
using (OracleDataReader reader = command.ExecuteReader())
{
// 遍历结果集
while (reader.Read())
{
Console.WriteLine($"Employee ID: {reader["EMPLOYEE_ID"]}, Name: {reader["FIRST_NAME"]} {reader["LAST_NAME"]}, Salary: {reader["SALARY"]}");
}
}
}
}
}
}
}
```
**逻辑分析**
1. 创建连接对象并打开连接。
2. 创建命令对象并设置命令类型为存储过程。
3. 设置存储过程名称。
4. 执行存储过程并获取结果集。
5. 遍历结果集并输出数据。
#### 3.1.2 更新存储过程的执行
**更新存储过程的调用方法**
```csharp
using Oracle.ManagedDataAccess.Client;
namespace OracleStoredProcedureDemo
{
public class UpdateStoredProcedure
{
public static void Main(string[] args)
{
// 连接字符串
string connectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)));User Id=scott;Password=tiger;";
// 创建连接对象
using (OracleConnection connection = new OracleConnection(connectionString))
{
// 创建命令对象
using (OracleCommand command = connection.CreateCommand())
{
// 设置命令类型为存储过程
command.CommandType = CommandType.StoredProcedure;
// 设置存储过程名称
command.CommandText = "UPDATE_EMPLOYEE";
// 添加输入参数
OracleParameter employeeIdParam = new OracleParameter("EMPLOYEE_ID", OracleDbType.Int32);
employeeIdParam.Value = 100;
command.Parameters.Add(employeeIdParam);
// 添加输出参数
OracleParameter salaryParam = new OracleParameter("SALARY", OracleDbType.Decimal);
salaryParam.Direction = ParameterDirection.Output;
command.Parameters.Add(salaryParam);
// 打开连接
connection.Open();
// 执行存储过程
command.ExecuteNonQuery();
// 获取输出参数的值
Console.WriteLine($"Updated salary: {salaryParam.Value}");
}
}
}
}
}
```
**逻辑分析**
1. 创建连接对象并打开连接。
2. 创建命令对象并设置命令类型为存储过程。
3. 设置存储过程名称。
4. 添加输入参数和输出参数。
5. 执行存储过程。
6. 获取输出参数的值并输出。
# 4. C#调用Oracle存储过程高级应用
### 4.1 存
0
0