C# OraOLEDB 存储过程输出参数
C# OraOLEDB Stored Procedure OUT Parameter
我正在尝试通过 C# 中的 OraOLEDB 提供程序调用这样一个简单的存储过程
程序只有一个OUT参数。这行不通。
DataTable dt 在调用 reader.GetSchemaTable()
.
之后为 null
有趣的是,如果我将 REF CURSOR TYPE 作为其他存储过程的输出参数,我可以使它工作。这个过程没有问题。可以在sqlplus中调用。我读过我不需要(实际上不能)手动绑定 REF CURSOR TYPE
。
问题是如何在 C# 中通过 OraOLEDB 调用具有非游标类型输出参数的存储过程。
请多多指教
Oracle 11g,Windows7 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;
/
cmd.ExecuteReader()
仅在 return RefCursor 时使用。
对于标量 return 值,您必须使用:
cmd.ExecuteNonQuery();
string emp = param["O_ENAME"].Value;
也许这个也有用:
string emp = cmd.ExecuteScalar().ToString();
您不能为 DataTable 使用标量值,除非您手动添加值。
我正在尝试通过 C# 中的 OraOLEDB 提供程序调用这样一个简单的存储过程
程序只有一个OUT参数。这行不通。
DataTable dt 在调用 reader.GetSchemaTable()
.
有趣的是,如果我将 REF CURSOR TYPE 作为其他存储过程的输出参数,我可以使它工作。这个过程没有问题。可以在sqlplus中调用。我读过我不需要(实际上不能)手动绑定 REF CURSOR TYPE
。
问题是如何在 C# 中通过 OraOLEDB 调用具有非游标类型输出参数的存储过程。
请多多指教
Oracle 11g,Windows7 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;
/
cmd.ExecuteReader()
仅在 return RefCursor 时使用。
对于标量 return 值,您必须使用:
cmd.ExecuteNonQuery();
string emp = param["O_ENAME"].Value;
也许这个也有用:
string emp = cmd.ExecuteScalar().ToString();
您不能为 DataTable 使用标量值,除非您手动添加值。