C#OraOLEDB存储过程OUT参数

时间:2015-04-28 10:19:37

标签: c# oracle stored-procedures oledb

我试图通过C#

中的OraOLEDB提供程序调用这样一个简单的存储过程

该过程只有一个OUT参数。这不起作用。

DataTable dt为空在该部分调用reader.GetSchemaTable()之后。

有趣的是,如果我将REF CURSOR TYPE作为输出参数与其他存储过程一起使用,我可以使它工作。此过程没有问题。它可以在sqlplus中调用。我已经读过,我不需要(实际上必须)手动绑定REF CURSOR TYPE

问题是如何在C#中调用OraOLEDB具有非游标类型输出参数的存储过程。

请给我一些建议。

Oracle 11g,Windows 7 64位 Link1 Link2

              try
              {
                  string connStr = "Provider=OraOLEDB.Oracle.1;User ID=scott;Password=tiger;Data Source=//localhost:1521/orcl;OLEDB.NET=1;PLSQLRSet=1;";
                  conn = new OleDbConnection(connStr);
                  conn.Open();

                  OleDbCommand cmd = new OleDbCommand();
                  cmd.Connection = conn;

                  OleDbParameter param = cmd.CreateParameter();
                  param.ParameterName = "O_ENAME";
                  param.Direction = ParameterDirection.Output;
                  param.OleDbType = OleDbType.Char;
                  param.Size = 15;

                  cmd.Parameters.Clear();
                  cmd.Parameters.Add(param);

                  cmd.CommandType = CommandType.Text;
                  cmd.CommandText = "{CALL SCOTT.EMPINFO(?)}";

                  OleDbDataReader reader = cmd.ExecuteReader();             
                  DataTable dt = reader.GetSchemaTable();   
              }

存储过程EMPINFO

CREATE OR REPLACE PROCEDURE
EMPINFO(O_ENAME OUT VARCHAR2)
IS
BEGIN
SELECT ENAME
INTO O_ENAME
FROM EMP
WHERE EMPNO=7369;
END;
/

1 个答案:

答案 0 :(得分:1)

cmd.ExecuteReader()仅在您返回RefCursor时使用。

对于标量返回值,您必须使用:

cmd.ExecuteNonQuery();
string emp = param["O_ENAME"].Value;

也许这个也有效:

string emp = cmd.ExecuteScalar().ToString();

除非手动添加值,否则不能对DataTable使用标量值。