使用 C# 和 Oracle 在存储函数中传递参数
Posted
技术标签:
【中文标题】使用 C# 和 Oracle 在存储函数中传递参数【英文标题】:Passed Parameter in Stored Function with C# and Oracle 【发布时间】:2016-03-17 20:40:54 【问题描述】:我有一个 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 返回的异常也证实了这一点。
这是一个简单的问题;谁能看到我在做什么使第一个参数作为空字符串传递?
感谢您的帮助;天黑了,很晚了,我需要在回家之前完成这件事!
【问题讨论】:
你确定函数的参数名称实际上是protein_batch_id
吗?那么return_data := UCB_SYNC.GET_PROTEIN_DETAILS(protein_batch_id => 'PB0000007');
也成功调用了函数?
是的;我刚试过
【参考方案1】:
您需要将命令的BindByName
属性设置为true
。
为此替换行
using (DbCommand cmd = cnn.CreateCommand())
与
using (OracleCommand cmd = cnn.CreateCommand())
然后添加一行
cmd.BindByName = true;
到配置cmd
的其他行。
【讨论】:
啊;这意味着我必须为此创建一个 oracle 子类。我需要对此进行一些重构。然而;我将 PL/SQL 方法从一个函数更改为一个带有 OUT 参数的过程,结果效果很好。我会同意这一点,但会带着这个建议回到这个话题。以上是关于使用 C# 和 Oracle 在存储函数中传递参数的主要内容,如果未能解决你的问题,请参考以下文章