使用 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 的其他行。