C# OleDb OUT 参数在调用 oracle 过程时失败

Posted

技术标签:

【中文标题】C# OleDb OUT 参数在调用 oracle 过程时失败【英文标题】:C# OleDb OUT parameter fails when calling oracle procedure 【发布时间】:2017-03-30 20:04:20 【问题描述】:

我正在调用一个具有 OUT 参数(CURSOR 类型)的过程。似乎我错过了一些东西,因为我收到错误:“错误的参数数量或类型......”。我的代码如下:

 public static DataTable SearchClient()
    
        try
        
            using (OleDbCommand cmd = new OleDbCommand(packetName + ".select_A1001310"))
            
                cmd.CommandType = CommandType.StoredProcedure;                                        
                cmd.Parameters.Add("io_cursor", OracleType.Cursor).Direction = ParameterDirection.Output;


                SqlManager sqlManager = new SqlManager();
                return sqlManager.GetDataTable(cmd);
            
        
        catch (Exception ex)
        
            ex.ToString();
            System.Console.WriteLine(ex);
            //TODO; Handle exception
        
        return null;
    

程序:

TYPE lcursor_data IS REF CURSOR;        
PROCEDURE select_A1001310(io_cursor OUT lcursor_data)
      AS
      BEGIN
        OPEN io_cursor FOR
        --
          SELECT client_id
            FROM a1001310
           WHERE status = 'A';
        --
      EXCEPTION
        WHEN OTHERS THEN
          IF io_cursor%ISOPEN THEN
            CLOSE io_cursor;
          END IF;
        --REVIRE: EXCEPTION HANDLER
      END select_A1001310;

有什么想法吗?

更新: 如果我更改我的代码,使用 OracleClient 而不是 OleDb,它可以工作。有没有办法使用 oleDb 而不是 OracleClient 来包含游标类型参数? OracleClient代码方式如下

public static DataTable SearchClient()

    string connection = ConfigurationManager.ConnectionStrings["DBConnection_Oracle"].ToString();
    string procedure = packetName + ".p_search_client";

    OracleParameter[] parameters = new OracleParameter[1];
    parameters[0] = new OracleParameter("io_cursor", OracleType.Cursor, 4000, ParameterDirection.Output, true, 0, 0, "", DataRowVersion.Current, String.Empty);

    DataTable dt = new DataTable();
    dt = DataManager_Oracle.GetDataTable_(connection, procedure, parameters);
    return dt;

【问题讨论】:

你能添加你的连接字符串吗?谢谢! 嗨。连接字符串如下。 <connectionStrings> <add name="DBConnection" connectionString="Provider=MSDAORA.1;Data Source=DB;User Id=user;Password=pass;enlist=false;OLE DB Services = -4" providerName="Oracle.DataAccess"/> </connectionStrings> 我已经更新了我的答案。 【参考方案1】:

如果您的存储过程返回一个行集,那么您的 web.config 中的 PLSQLRSet 必须设置为 TRUE

<connectionStrings> 
        <add name="DBConnection" connectionString="Provider=MSDAORA.1;Data Source=DB;User Id=user;Password=pass;enlist=false;PLSQLRSet=true;OLE DB Services = -4" providerName="Oracle.DataAccess"/> 
</connectionStrings>

【讨论】:

我按照建议包含了提到的属性,但我仍然遇到同样的问题。现在,如果我通过使用 OracleClient 而不是 OleDb 来改变我的整个方法,它就可以工作。有没有办法使用 oleDb 而不是 OracleClient 来包含 Cursor 类型参数?我会将上述方法(OracleClient)显示为更新... 你是绝对正确的@Nagaraj Raveendran;经过一些故障排除后,您的方法(添加属性 PLSQLRset)对我有用。非常感谢朋友! 顺便说一句,为了工作,我必须删除代码中的 OUT 参数声明 (cmd.Parameters.Add("io_cursor",...)

以上是关于C# OleDb OUT 参数在调用 oracle 过程时失败的主要内容,如果未能解决你的问题,请参考以下文章

c#通过oledb连接Oracle代码

客户端web访问oracle 提示ORA-12535: TNS:operation timed out 异常详细信息: System.Data.OleDb.OleDbEx

在 Oracle JDBC 中是不是可以批量存储过程调用和检索 OUT 参数?

C#调用Access数据库时出现乱码。

Winforms (C#) 中的 OleDb 参数查询:没有错误但没有更新行

C# OleDb 插入带参数的整数