0

私は、データを挿入するために機能し、何ヶ月も機能しているストアドプロシージャを持っています。

これが「短い」バージョンです。

procedure saveApplication(  in_confirmation_number  varchar2 := null                           
                            ,in_nonstandard_address varchar2 := null      
                            ,in_absentee_type varchar2 := null) AS
  BEGIN
    insert into vr_application (
            confirmation_number
            ,nonstandard_address
            ,absentee_type )
    values ( in_confirmation_number
            ,in_nonstandard_address
            ,in_absentee_type 
            );
END;

私は大量に作業しているので、データテーブルから値を取得した後、データを配列として詰め込みます。繰り返しますが、以下は「短縮」バージョンです。

private static void loadFiles(DataTable dt, string connString, ErrorLogger log)
    {

        OracleConnection orclconn = null;
        OracleCommand cmd = null;

        using (orclconn = new OracleConnection(connString))
        {
            orclconn.Open();
            using (cmd = BuildCommand(dt))
            {
                cmd.Connection = orclconn;
                cmd.ExecuteNonQuery();
            }
        }

    }

 private static OracleCommand BuildCommand(DataTable dt)
    {
        OracleCommand cmd = new OracleCommand();
        cmd.CommandText = "Applications.saveApplication";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.ArrayBindCount = dt.Rows.Count;
        cmd.BindByName = true;

        string[] CONFIRMATION_NUMBER = dt
           .AsEnumerable()
           .Select(row => row.Field<string>("CONFIRMATION_NUMBER"))
           .ToArray();
        OracleParameter in_confirmation_number = new OracleParameter();
        in_confirmation_number.OracleDbType = OracleDbType.Varchar2;
        in_confirmation_number.Value = CONFIRMATION_NUMBER;
        in_confirmation_number.ParameterName = "in_confirmation_number";
        cmd.Parameters.Add(in_confirmation_number);

         string[] ABSENTEE_TYPE = dt
            .AsEnumerable()
            .Select(row => row.Field<string>("ABSENTEE_TYPE"))
            .ToArray();
        OracleParameter in_absentee_type = new OracleParameter();
        in_absentee_type.OracleDbType = OracleDbType.Varchar2;
        in_absentee_type.Value = ABSENTEE_TYPE;
        in_absentee_type.ParameterName = "in_absentee_type";
        cmd.Parameters.Add(in_absentee_type);

        string[] NONSTANDARD_ADDRESS = dt
         .AsEnumerable()
         .Select(row => row.Field<string>("NONSTANDARD_ADDRESS"))
         .ToArray();
        OracleParameter in_nonstandard_address = new OracleParameter();
        in_absentee_type.OracleDbType = OracleDbType.Varchar2;
        in_absentee_type.Value = NONSTANDARD_ADDRESS;
        in_absentee_type.ParameterName = "in_nonstandard_address";
        cmd.Parameters.Add(in_nonstandard_address);

        return cmd;
}

シナリオ1: nonstandard_addressコードがコメント化されています。すべてが機能します。

シナリオ2: nonstandard_addressコードはコメント化されていません。しかし、元のデータテーブルに値を渡す代わりに、値「null」をハードコーディングします。すべてが機能します。これはそれが何ヶ月も続いているところです。

シナリオ3: 非標準アドレスのデータテーブルに、非標準アドレスの値を持つ単一の行があります。他のすべての行には、この列のnullが含まれています。Oracle.DataAccess.Client.OracleException、#ORA-06550が表示され、次のいずれかが必要な場合に「シンボルに遭遇しました>」というメッセージが表示されます。

問題を特定するために、配列内の値をループするだけです。最後のループ反復で同じエラーが発生します。これは、常にデータテーブルのレコード数(100)より1つ多くなります。しかし、非標準のOracleパラメータを作成しようとせずにループすると、エラーは発生せず、ループの反復は100回だけになります。

シナリオ2を実行し、nonstandard_addressを除くすべてをテーブルに正常に入力すると、Oracleで次のコマンドを実行して、テーブルを正常に更新できます。

update vr_application a
set nonstandard_address = (select nonstandard_address from unprocessed_apps b where b.confirmation_number = a.confirmation_number)
where exists (select 1 from unprocessed_apps where confirmation_number = a.confirmation_number)

誰かがここで間違いを見ることができますか?これを見た人はいますか?私は困惑しています。

4

1 に答える 1

0

まあ、それはそれらの「当たり前の」瞬間の1つであり、余分な目になることができる同僚を持つための良い議論でした。

私のコードを見てください-私は不在地主フィールドに住所を入力しました。これは私が持っていたものです:

    string[] NONSTANDARD_ADDRESS = dt
     .AsEnumerable()
     .Select(row => row.Field<string>("NONSTANDARD_ADDRESS"))
     .ToArray();
    OracleParameter in_nonstandard_address = new OracleParameter();
    **in_absentee_type**.OracleDbType = OracleDbType.Varchar2;
    **in_absentee_type**.Value = NONSTANDARD_ADDRESS;
    **in_absentee_type**.ParameterName = "in_nonstandard_address";
    cmd.Parameters.Add(in_nonstandard_address);

これは私が持っているべきものです:

       string[] NONSTANDARD_ADDRESS = dt
           .AsEnumerable()
           .Select(row => row.Field<string>("NONSTANDARD_ADDRESS"))
           .ToArray();
        OracleParameter in_nonstandard_address = new OracleParameter();
        **in_nonstandard_address**.OracleDbType = OracleDbType.Varchar2;
        **in_nonstandard_address**.Value = NONSTANDARD_ADDRESS;
        **in_nonstandard_address**.ParameterName = "in_nonstandard_address";
        cmd.Parameters.Add(in_nonstandard_address);

上記のような72のアレイを見つめた後、私の目はそれを完全に見逃しました。構文の問題を私に浮かび上がらせた何かを提案してくれたBobJarvisに感謝します。

于 2012-07-21T15:55:11.437 に答える