5

C# アプリケーションから ODP.NET を使用して Oracle テーブルにデータを挿入しようとしていますが、 NULL 値を挿入していない列に対してORA-01400 can't insert null valueエラーが発生します。

これは、実行しようとしているパラメーター化された SQL コマンドの簡略化されたバージョンです。でラップOracleCommandされ、次の呼び出しで実行されExecuteNonQueryます。

declare c int; 
begin
   select count(*) into c from "Entradas" where "Id" = :Id and nvl("AppId", 0) = nvl(:AppId, 0);
   if c>0 then
       update "Entradas" set
         /*...a bunch of columns...*/,
         "VisitaLaboral" = :VisitaLaboral,
         /*...some more columns...*/
         where "Id" = :Id and nvl("AppId",0) = nvl(:AppId, 0); 
   else
       insert into "Entradas" (
         /*... a bunch of columns...*/,
         "VisitaLaboral",
         /*...some more columns...*/
         ) values (
         /*...a bunch of values...*/,
         :VisitaLaboral,
         /*...some more values...*/
       );
   end if;
end;

行は以前に存在しないため、insert実行されるのはコマンドの一部です。もちろん、すべての列名と列値パラメーターが SQL テキストに適切に配置されていることを確認しました。

問題はVisitaLaboralコラムにあります。これは NUMBER(1,0) 型であり、NULL を受け入れず、0 の値を挿入しようとしています。これはOracleParameter、コマンド実行の直前に関連付けられたものについて Visual Studio が表示するものです。

ここに画像の説明を入力

ただし、Application Express でコマンドを直接実行すると (コマンド テキストに値を直接指定して)、正常に動作し、行が挿入されます。

それで、ここで何が起こっているのですか?ODP.NET ライブラリにバグがありますか、それとも何か問題がありますか?

追加情報:

  • データベースは Oracle 10g Express リリース 10.2.0.1.0 です。
  • Oracle.DataAccess.dll のバージョンは 4.112.1.2 です
  • Visual Studio 2010 を使用し、.NET Framework 4.0 を対象とする

前もって感謝します!

アップデート:

System.Data.OracleClientODP.NET の代わりに(非推奨の) クラスを使用すると、すべて正常に動作します。

なんてこった、オラクル?いいえ、本当に、WTF?

4

5 に答える 5

2

あなたの問題は、データベースで実際に何が起こっているのかわからないことです。最も迅速な解決策は、何が起こるかを見つけてそれを使用することです。

  1. データベースに接続する
  2. dbms_session.set_sql_trace(true) を使用して SQL トレースを有効にします
  3. アプリケーションアクションを実行します
  4. データベースから切断する
  5. 生のトレースファイルを送信するように検索するか、データベース管理者に依頼してください

トレースファイル (プレーン テキスト ファイル) でコードを見つけ、エラーが発生したときに何が起こるかを確認します。

引き金が引かれたのかもしれません....

于 2011-03-16T12:25:29.537 に答える
0

insert 句と values 句の両方で列が同じ順序になっていることを本当に確信していますか? 「列の束」を確認してください...

于 2011-03-16T09:45:36.593 に答える
0

同じ問題がありました。列プロパティ "IsNullable" を true に設定する問題を解決しました。

于 2011-03-16T09:53:48.503 に答える