当前位置:首页 > 行业动态 > 正文

ado.net 执行oracle机油游标又有int类型的存储过程

ADO.NET 可以通过 OracleDataAdapter 和 OracleCommand 执行存储过程,包括带有 int 类型参数的 存储过程

ADO.NET 执行 Oracle 存储过程(含游标和 int 类型参数)

在 .NET 应用程序中,使用 ADO.NET 来执行 Oracle 数据库中的存储过程是一个常见的需求,特别是当存储过程包含游标和int 类型的参数时,正确的处理方式显得尤为重要,本文将详细介绍如何使用 ADO.NET 执行包含游标的 Oracle 存储过程,并处理int 类型的参数。

前提条件

1、安装 Oracle 客户端:确保你的开发环境中安装了 Oracle 客户端,并且配置了TNS_ADMIN 环境变量。

2、添加引用:在你的 .NET 项目中,添加对System.Data.OracleClientOracle.ManagedDataAccess 的引用。

步骤一:创建 Oracle 存储过程

我们需要在 Oracle 数据库中创建一个包含游标和int 类型参数的存储过程,以下是一个简单的示例:

CREATE OR REPLACE PROCEDURE GetEmployeesByDepartment (
    p_department_id IN NUMBER,
    p_cursor OUT SYS_REFCURSOR
) IS
BEGIN
    OPEN p_cursor FOR
        SELECT employee_id, first_name, last_name
        FROM employees
        WHERE department_id = p_department_id;
END;
/

在这个存储过程中,我们定义了一个输入参数p_department_id(类型为NUMBER,对应于 .NET 中的int),以及一个输出参数p_cursor(类型为SYS_REFCURSOR,用于返回查询结果)。

步骤二:使用 ADO.NET 调用存储过程

我们在 .NET 应用程序中使用 ADO.NET 来调用这个存储过程,并处理返回的游标数据。

ado.net 执行oracle机油游标又有int类型的存储过程

1. 配置连接字符串

配置与 Oracle 数据库的连接字符串,这通常存储在配置文件中,例如app.configweb.config

<connectionStrings>
    <add name="OracleConnection" connectionString="User Id=your_username;Password=your_password;Data Source=your_data_source;" providerName="Oracle.ManagedDataAccess.Client"/>
</connectionStrings>

请将your_usernameyour_passwordyour_data_source 替换为实际的数据库凭据和数据源名称。

2. 编写代码调用存储过程

以下是一个使用 C# 调用上述存储过程的示例代码:

using System;
using System.Data;
using Oracle.ManagedDataAccess.Client;
class Program
{
    static void Main()
    {
        string constr = "User Id=your_username;Password=your_password;Data Source=your_data_source;";
        using (OracleConnection con = new OracleConnection(constr))
        {
            try
            {
                con.Open();
                OracleCommand cmd = new OracleCommand("GetEmployeesByDepartment", con);
                cmd.CommandType = CommandType.StoredProcedure;
                // 添加 int 类型参数
                OracleParameter p_department_id = new OracleParameter("p_department_id", OracleDbType.Int32);
                p_department_id.Value = 10; // 示例部门 ID
                cmd.Parameters.Add(p_department_id);
                // 添加游标参数
                OracleParameter p_cursor = new OracleParameter("p_cursor", OracleDbType.RefCursor);
                p_cursor.Direction = ParameterDirection.Output;
                cmd.Parameters.Add(p_cursor);
                // 执行存储过程
                cmd.ExecuteNonQuery();
                // 读取游标数据
                using (OracleDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        Console.WriteLine($"Employee ID: {reader["employee_id"]}, First Name: {reader["first_name"]}, Last Name: {reader["last_name"]}");
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error: {ex.Message}");
            }
        }
    }
}

在这个示例中,我们:

ado.net 执行oracle机油游标又有int类型的存储过程

创建了一个OracleConnection 对象,并使用连接字符串打开与数据库的连接。

创建了一个OracleCommand 对象,指定要执行的存储过程名称,并将其CommandType 设置为StoredProcedure

添加了两个参数:一个是int 类型的p_department_id,另一个是RefCursor 类型的p_cursor,用于接收存储过程返回的游标。

调用ExecuteNonQuery 方法执行存储过程。

使用ExecuteReader 方法读取游标中的数据,并在控制台中输出每个员工的详细信息。

表格:存储过程参数说明

参数名 类型 方向 描述
p_department_id NUMBER (int) IN 部门 ID
p_cursor SYS_REFCURSOR OUT 返回员工信息的游标

FAQs

Q1: 如果存储过程有多个游标返回怎么办?

ado.net 执行oracle机油游标又有int类型的存储过程

A1: 如果存储过程返回多个游标,你可以在OracleCommand 对象中添加多个RefCursor 类型的输出参数,并在执行存储过程后,依次读取每个游标的数据。

OracleParameter p_cursor1 = new OracleParameter("p_cursor1", OracleDbType.RefCursor);
p_cursor1.Direction = ParameterDirection.Output;
cmd.Parameters.Add(p_cursor1);
OracleParameter p_cursor2 = new OracleParameter("p_cursor2", OracleDbType.RefCursor);
p_cursor2.Direction = ParameterDirection.Output;
cmd.Parameters.Add(p_cursor2);
// 执行存储过程...
using (OracleDataReader reader1 = cmd.ExecuteReader())
{
    // 处理第一个游标的数据...
}
// 重置命令以读取下一个游标
cmd.Parameters["p_cursor1"].Value = DBNull.Value;
using (OracleDataReader reader2 = cmd.ExecuteReader())
{
    // 处理第二个游标的数据...
}

Q2: 如何处理存储过程中的异常?

A2: 在调用存储过程时,建议使用try-catch 块来捕获和处理任何可能的异常,这样可以记录错误信息,并根据需要采取相应的措施,例如回滚事务或通知用户。

try
{
    // 执行存储过程...
}
catch (OracleException ex)
{
    Console.WriteLine($"Oracle Error: {ex.Message}");
    // 根据需要处理异常,例如回滚事务或记录日志
}
catch (Exception ex)
{
    Console.WriteLine($"General Error: {ex.Message}");
    // 处理其他类型的异常
}

小编有话说

使用 ADO.NET 执行包含游标和int 类型参数的 Oracle 存储过程并不复杂,但需要正确配置连接字符串、添加适当的参数,并妥善处理返回的游标数据,通过遵循本文介绍的步骤,你可以轻松地在 .NET 应用程序中集成和操作 Oracle 数据库中的存储过程,实现高效的数据访问和业务逻辑处理,记得在实际开发中,始终注意异常处理和资源管理,以确保应用程序的稳定性和可靠性。