使用 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 在存储函数中传递参数的主要内容,如果未能解决你的问题,请参考以下文章

oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)

ORACLE中如何为存储过程传递参数?

如何在c#中传递数组Oracle参数

如何在 C# 中测试来自 Oracle 的参数

将字节数组传递给 oracle 存储过程

C#高级编程