使用 C# 和 Oracle 在存储函数中传递参数
Passed Parameter in Stored Function with C# and Oracle
我有一个 Oracle 存储函数,在 Oracle 中调用如下:
DECLARE
return_data varchar2(32767);
BEGIN
return_data := UCB_SYNC.GET_PROTEIN_DETAILS('PB0000007');
DBMS_OUTPUT.PUT_LINE(return_data);
END;
这很好用,所以我现在想在 C# 中调用它;所以我有以下代码:
public string ExecuteStoredProcedure()
{
using (DbConnection cnn = GetNewConnection())
{
cnn.Open();
using (DbCommand cmd = cnn.CreateCommand())
{
cmd.CommandText = "ucb_sync.get_protein_details";
cmd.CommandType = CommandType.StoredProcedure;
DbParameter dbp = cmd.CreateParameter();
dbp.ParameterName = "protein_batch_id";
dbp.Value = "PB0000007";
dbp.DbType = DbType.String;
cmd.Parameters.Add(dbp);
DbParameter returnDbp = cmd.CreateParameter();
returnDbp.Direction = ParameterDirection.ReturnValue;
returnDbp.ParameterName ="result_data";
returnDbp.DbType = DbType.String;
cmd.Parameters.Add(returnDbp);
try
{
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
throw e;
}
return returnDbp.Value.ToString();
}
}
}
这会执行,但第一个参数 (protein_batch_id) 作为空字符串传递。我可以从我的日志中看到这一点,从 Oracle 返回的异常也证实了这一点。
这是一个简单的问题;谁能看到我正在做什么以导致第一个参数作为空字符串传递?
感谢您的帮助;天黑了,晚了,我需要在回家前完成这件事!
您需要将命令的BindByName
属性设置为true
。
为此替换行
using (DbCommand cmd = cnn.CreateCommand())
和
using (OracleCommand cmd = cnn.CreateCommand())
然后添加行
cmd.BindByName = true;
到配置 cmd
的其他行。
我有一个 Oracle 存储函数,在 Oracle 中调用如下:
DECLARE
return_data varchar2(32767);
BEGIN
return_data := UCB_SYNC.GET_PROTEIN_DETAILS('PB0000007');
DBMS_OUTPUT.PUT_LINE(return_data);
END;
这很好用,所以我现在想在 C# 中调用它;所以我有以下代码:
public string ExecuteStoredProcedure()
{
using (DbConnection cnn = GetNewConnection())
{
cnn.Open();
using (DbCommand cmd = cnn.CreateCommand())
{
cmd.CommandText = "ucb_sync.get_protein_details";
cmd.CommandType = CommandType.StoredProcedure;
DbParameter dbp = cmd.CreateParameter();
dbp.ParameterName = "protein_batch_id";
dbp.Value = "PB0000007";
dbp.DbType = DbType.String;
cmd.Parameters.Add(dbp);
DbParameter returnDbp = cmd.CreateParameter();
returnDbp.Direction = ParameterDirection.ReturnValue;
returnDbp.ParameterName ="result_data";
returnDbp.DbType = DbType.String;
cmd.Parameters.Add(returnDbp);
try
{
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
throw e;
}
return returnDbp.Value.ToString();
}
}
}
这会执行,但第一个参数 (protein_batch_id) 作为空字符串传递。我可以从我的日志中看到这一点,从 Oracle 返回的异常也证实了这一点。
这是一个简单的问题;谁能看到我正在做什么以导致第一个参数作为空字符串传递?
感谢您的帮助;天黑了,晚了,我需要在回家前完成这件事!
您需要将命令的BindByName
属性设置为true
。
为此替换行
using (DbCommand cmd = cnn.CreateCommand())
和
using (OracleCommand cmd = cnn.CreateCommand())
然后添加行
cmd.BindByName = true;
到配置 cmd
的其他行。