调用 returns 值的数据库存储函数或存储过程
Calling a database stored function or stored proc that returns a value
将 linq2db 与 oracle 12 数据库一起使用,如何调用 returns 值的存储函数或存储过程?从我能找到的信息来看,解决方案似乎是使用:
IEnumerable<T> QueryProc<T>(
this DataConnection connection,
string sql,
params DataParameter[] parameters);
但它不适用于函数和存储过程,我没有收到来自过程的输出值。
create or replace PROCEDURE TESTPROC(inputParm VARCHAR2, outputParm OUT VARCHAR2)
IS
BEGIN
outputParm := 'TEST OUTPUT STRING';
END TESTPROC;
我通过以下方式使用 linq2db 调用它:
DataParameter[] para = { new DataParameter("inputParm", "some_string", DataType.VarChar), new DataParameter("outputParm", "", DataType.VarChar) };
var res = myDataContext.QueryProc<string>("TESTPROC", para).FirstOrDefault();
我做错了什么?
更新:更新后的答案是正确的
IEnumerable<T> QueryProc<T>(...)
return 值是一个数据集,return由 procedure/function 由 select 语句编辑。
如果您的程序没有 return table,您需要使用 ExecuteProc
的非通用版本,这只是 return 受影响记录的数量。
要获取输出参数值,您需要访问命令中的参数:
((IDbDataParameter)dataConnection.Command.Parameters["parameter_name"]).Value
下面是来自 linq2db 测试的过程调用助手的示例,由 T4 模板生成:
public static int OUTREFTEST(this DataConnection dataConnection, decimal? PID, out decimal? POUTPUTID, ref decimal? PINPUTOUTPUTID, string PSTR, out string POUTPUTSTR, ref string PINPUTOUTPUTSTR)
{
var ret = dataConnection.ExecuteProc("TESTUSER.OUTREFTEST",
new DataParameter("PID", PID, DataType.Decimal),
new DataParameter("POUTPUTID", null, DataType.Decimal) { Direction = ParameterDirection.Output, Size = 22 },
new DataParameter("PINPUTOUTPUTID", PINPUTOUTPUTID, DataType.Decimal) { Direction = ParameterDirection.InputOutput, Size = 22 },
new DataParameter("PSTR", PSTR, DataType.NVarChar),
new DataParameter("POUTPUTSTR", null, DataType.NVarChar) { Direction = ParameterDirection.Output },
new DataParameter("PINPUTOUTPUTSTR", PINPUTOUTPUTSTR, DataType.NVarChar) { Direction = ParameterDirection.InputOutput });
POUTPUTID = Converter.ChangeTypeTo<decimal?>(((IDbDataParameter)dataConnection.Command.Parameters["POUTPUTID"]). Value);
PINPUTOUTPUTID = Converter.ChangeTypeTo<decimal?>(((IDbDataParameter)dataConnection.Command.Parameters["PINPUTOUTPUTID"]). Value);
POUTPUTSTR = Converter.ChangeTypeTo<string> (((IDbDataParameter)dataConnection.Command.Parameters["POUTPUTSTR"]). Value);
PINPUTOUTPUTSTR = Converter.ChangeTypeTo<string> (((IDbDataParameter)dataConnection.Command.Parameters["PINPUTOUTPUTSTR"]).Value);
return ret;
}
将 linq2db 与 oracle 12 数据库一起使用,如何调用 returns 值的存储函数或存储过程?从我能找到的信息来看,解决方案似乎是使用:
IEnumerable<T> QueryProc<T>(
this DataConnection connection,
string sql,
params DataParameter[] parameters);
但它不适用于函数和存储过程,我没有收到来自过程的输出值。
create or replace PROCEDURE TESTPROC(inputParm VARCHAR2, outputParm OUT VARCHAR2)
IS
BEGIN
outputParm := 'TEST OUTPUT STRING';
END TESTPROC;
我通过以下方式使用 linq2db 调用它:
DataParameter[] para = { new DataParameter("inputParm", "some_string", DataType.VarChar), new DataParameter("outputParm", "", DataType.VarChar) };
var res = myDataContext.QueryProc<string>("TESTPROC", para).FirstOrDefault();
我做错了什么?
更新:更新后的答案是正确的
IEnumerable<T> QueryProc<T>(...)
return 值是一个数据集,return由 procedure/function 由 select 语句编辑。
如果您的程序没有 return table,您需要使用 ExecuteProc
的非通用版本,这只是 return 受影响记录的数量。
要获取输出参数值,您需要访问命令中的参数:
((IDbDataParameter)dataConnection.Command.Parameters["parameter_name"]).Value
下面是来自 linq2db 测试的过程调用助手的示例,由 T4 模板生成:
public static int OUTREFTEST(this DataConnection dataConnection, decimal? PID, out decimal? POUTPUTID, ref decimal? PINPUTOUTPUTID, string PSTR, out string POUTPUTSTR, ref string PINPUTOUTPUTSTR)
{
var ret = dataConnection.ExecuteProc("TESTUSER.OUTREFTEST",
new DataParameter("PID", PID, DataType.Decimal),
new DataParameter("POUTPUTID", null, DataType.Decimal) { Direction = ParameterDirection.Output, Size = 22 },
new DataParameter("PINPUTOUTPUTID", PINPUTOUTPUTID, DataType.Decimal) { Direction = ParameterDirection.InputOutput, Size = 22 },
new DataParameter("PSTR", PSTR, DataType.NVarChar),
new DataParameter("POUTPUTSTR", null, DataType.NVarChar) { Direction = ParameterDirection.Output },
new DataParameter("PINPUTOUTPUTSTR", PINPUTOUTPUTSTR, DataType.NVarChar) { Direction = ParameterDirection.InputOutput });
POUTPUTID = Converter.ChangeTypeTo<decimal?>(((IDbDataParameter)dataConnection.Command.Parameters["POUTPUTID"]). Value);
PINPUTOUTPUTID = Converter.ChangeTypeTo<decimal?>(((IDbDataParameter)dataConnection.Command.Parameters["PINPUTOUTPUTID"]). Value);
POUTPUTSTR = Converter.ChangeTypeTo<string> (((IDbDataParameter)dataConnection.Command.Parameters["POUTPUTSTR"]). Value);
PINPUTOUTPUTSTR = Converter.ChangeTypeTo<string> (((IDbDataParameter)dataConnection.Command.Parameters["PINPUTOUTPUTSTR"]).Value);
return ret;
}