ORA-01008:并非所有变量都与空值绑定

时间:2012-10-31 19:18:27

标签: c# oracle

我正在创建一个查询,我似乎无法超越Oracle中的Not all variables bound错误

尽我所知,一切看起来都是正确的。我错过了什么?

代码混淆了一点以保护无辜者......

OracleCommand execCmd = new OracleCommand();

OracleParameter outParam =
        new OracleParameter("ID", OracleType.Int32);
outParam.Value = DBNull.Value;
outParam.Direction = System.Data.ParameterDirection.Output;
execCmd.CommandText = "insert into o " +
        "(A, B, " +
        "C, D, E, " +
        "F, G, H, I, " +
        "J, K) " +
        "VALUES (:A, :B, :C, :D, :E, " +
        ":F, :G, :H, :I, :J, :K) " +
        "RETURNING O_ID INTO :ID";
execCmd.Parameters.AddWithValue("A", og.N);
execCmd.Parameters.AddWithValue("B", DBNull.Value);
execCmd.Parameters.AddWithValue("C", DBNull.Value);
execCmd.Parameters.AddWithValue("D", og.A);
execCmd.Parameters.AddWithValue("E",
    og.A1 + " " + og.A2 + " " + og.A3 +
    " " + og.C);
execCmd.Parameters.AddWithValue("F", DBNull.Value);
execCmd.Parameters.AddWithValue("G", DBNull.Value);
execCmd.Parameters.AddWithValue("H", og.Cs);
execCmd.Parameters.AddWithValue("I", ss);
execCmd.Parameters.AddWithValue("J", DBNull.Value);
execCmd.Parameters.AddWithValue("K", "N");
execCmd.Parameters.Add(outParam);
conn.executeCommand(execCmd, trx);

3 个答案:

答案 0 :(得分:5)

我最终能够解决这个问题。原来我的一个字符串实际上是null,并且此版本的OracleCommand中有一个错误(标记为已弃用),导致它删除空参数。我的解决方案是在执行之前运行一个fixup函数。

此外,正如其他人所说,订单很重要。所以,这也需要正确。

这对我有用,在执行前调用它:

private void PopulateNullParameters(OracleCommand cmd)
{
    foreach (OracleParameter p in cmd.Parameters)
    {
        if (p.Value == null)
        {
            p.Value = DBNull.Value;
        }
    }
}

答案 1 :(得分:1)

看起来你错过了ID的参数,在最后一行:

"RETURNING ORGANIZATION_ID INTO :ID";

此外,基于this SO question,OracleCommand对象似乎按位置绑定参数,因此如果您的参数出现故障,您可能需要查看使用BindByName属性:< / p>

using(OracleCommand cmd = con.CreateCommand()) {
    ...
    cmd.BindByName = true;
    ...
}

答案 2 :(得分:0)

尝试在参数名称前加上:冒号

e.g。

  execCmd.Parameters.AddWithValue(":NAME", org.Name);
  execCmd.Parameters.AddWithValue(":EDP", DBNull.Value);
  execCmd.Parameters.AddWithValue(":EDD", DBNull.Value);
  execCmd.Parameters.AddWithValue(":ACRONYM", org.Acronym);    
  ....