2

Not all variables boundクエリを作成していますが、Oracleのエラーを超えることができないようです

私が知る限り、すべてが正しく見えます。私は何が欠けていますか?

罪のない人を保護するために、コードは少し難読化されています...

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);
4

3 に答える 3

6

私は最終的にこれを解決することができました。私の文字列の 1 つが実際には null であることが判明しました。このバージョンのOracleCommand(非推奨としてマークされている) には、null パラメータを削除するバグがあります。私にとっての解決策は、実行する前に修正機能を実行することでした。

また、他の人が述べたように、順序は重要です。したがって、それも正しい必要があります。

これが私のために働いたもので、実行の直前にそれを呼び出します:

private void PopulateNullParameters(OracleCommand cmd)
{
    foreach (OracleParameter p in cmd.Parameters)
    {
        if (p.Value == null)
        {
            p.Value = DBNull.Value;
        }
    }
}
于 2012-11-01T13:22:03.520 に答える
1

この最後の行で、IDのパラメーターが欠落しているようです。

"RETURNING ORGANIZATION_ID INTO :ID";

また、このSOの質問に基づくと、OracleCommandオブジェクトはパラメータを位置によってバインドしているように見えるため、パラメータの順序が正しくない場合は、BindByNameプロパティの使用を検討することをお勧めします。

using(OracleCommand cmd = con.CreateCommand()) {
    ...
    cmd.BindByName = true;
    ...
}
于 2012-10-31T19:32:24.457 に答える
0

:パラメータ名の前にコロンを付けてください

例えば

  execCmd.Parameters.AddWithValue(":NAME", org.Name);
  execCmd.Parameters.AddWithValue(":EDP", DBNull.Value);
  execCmd.Parameters.AddWithValue(":EDD", DBNull.Value);
  execCmd.Parameters.AddWithValue(":ACRONYM", org.Acronym);    
  ....
于 2012-11-01T00:22:47.123 に答える