【问题标题】:ORA-01008 : Not all variables bound with nullsORA-01008: 并非所有变量都与空值绑定
【发布时间】:2012-10-31 19:18:26
【问题描述】:

我正在创建一个查询,但我似乎无法超越 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);

【问题讨论】:

    标签: c# oracle


    【解决方案1】:

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

    另外,正如其他人所说,顺序确实很重要。所以,这也必须是正确的。

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

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

    【讨论】:

    • 太棒了。也为我工作!
    【解决方案2】:

    您在最后一行中似乎缺少 ID 参数:

    "RETURNING ORGANIZATION_ID INTO :ID";
    

    此外,基于this SO question,OracleCommand 对象似乎按位置绑定参数,因此如果您的参数乱序,您可能需要查看使用BindByName 属性:

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

    【讨论】:

    • 谢谢,但它实际上是在顶部声明的,并在底部按顺序/位置添加,所以BindByName 不是我认为的问题。奇怪的是,我似乎错过了那个属性......
    【解决方案3】:

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

    例如

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

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 1970-01-01
      • 2011-09-22
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2014-01-29
      相关资源
      最近更新 更多