0

鉴于我有这个 Oracle 存储过程(这是一个测试示例)

PROCEDURE dave IS
dave_data SYS_REFCURSOR;
v_col1 NUMBER;
v_col2 VARCHAr2(100);
BEGIN
 DBMS_OUTPUT.ENABLE(2000000);
 dave_truck_ticket.get_report_data(dave_data,1234,'01-JUL-13','15-Jul-13');
 LOOP
    FETCH dave_data INTO v_col1, v_col2;
    EXIT WHEN dave_data%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(v_col1||'   -  '||v_col2);
 END LOOP;
 CLOSE dave_data;
END;

是的,错误可能出在存储过程中——因为我以前从未接触过 Oracle。

我正在尝试以这种方式从游标(dave_data)读取数据:

  O.OracleConnection objConn = new O.OracleConnection("DATA SOURCE=XXXDEV.WORLD;USER ID=XXXXXX;PASSWORD=XXXXXX;");

  O.OracleCommand objCmd = new O.OracleCommand();

  objCmd.Connection = objConn;

  objCmd.CommandText = "DAVE";

  objCmd.CommandType = System.Data.CommandType.StoredProcedure;

  O.OracleParameter cursor = new O.OracleParameter("dave_data", O.OracleDbType.RefCursor);
  cursor.Direction = System.Data.ParameterDirection.Output;

  objCmd.Parameters.Add(cursor);

  try
  {

    objConn.Open();

    O.OracleDataReader objReader = objCmd.ExecuteReader();
    objReader.Read();
    objReader[0].ToString();

我的 O. 参考被指定为: using O = Oracle.DataAccess.Client; (版本 4.112.3.0)

我收到的错误(直接在 ExecuteReader() 之后)是: 甲骨文错误

更令人气愤的是,我可以从服务器资源管理器中执行示例——而且效果很好!

请善待并指出我在哪里是一个贵族......

4

1 回答 1

0

问题在于 Oracle 过程,而不是 C# 代码。我从另一位开发人员那里收到了 Oracle 程序,我们之间的关系被打破了。一旦他使用参考光标创建了一个 OUT 参数,它就可以正常工作。+1 给 OldProgrammer - 你应该把你的评论作为答案!

于 2013-08-02T15:57:49.097 回答