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.OracleClient
ODP.NET の代わりに(非推奨の) クラスを使用すると、すべて正常に動作します。
なんてこった、オラクル?いいえ、本当に、WTF?