10

次のように、パラメーター化されたクエリを使用して、値を Oracle テーブルに挿入しています。

var q = "insert into MyTable(Field1, Field2...) values(:Field1, :Field2...)";
var cmd = new OracleCommand(q, conn); // conn is a pre-existing connection
cmd.Parameters.Add("Field1", field1Val); 
cmd.Parameters.Add("Field2", field2Val);
// etc...
cmd.ExecuteNonQuery();

これは正常に機能していましたが、突然機能しなくなり、Oracle エラー ORA-01722 (無効な番号) が発生しました。パラメータを確認しましたが、すべての数値は間違いなく有効な数値です。ヌルをダミー値に置き換えても、エラーが発生します。Direct SQL (OraDeveloper Studio を使用) で同じクエリを試してみましたが、同じパラメータでも機能します。

これを追跡するにはどうすればよいですか?

編集:コメントのリクエストごとに、create table ステートメントは次のとおりです。

CREATE TABLE ALPHA.VISITFINDINGS (
  ID NUMBER(12),
  VISITID NUMBER(12) NOT NULL,
  DESCRIPTION VARCHAR2(100),
  CUSTOMIMAGE CLOB,
  VISUALFINDINGSSECTIONMAPID NUMBER(12),
  FINDINGSID NUMBER(12),
  CONSTRAINT FK_VISITFINDINGS_AREA FOREIGN KEY (VISUALFINDINGSSECTIONMAPID)
    REFERENCES ALPHA.VISUALFINDINGSSECTIONMAP(VISUALFINDINGSSECTIONMAPID),
  CONSTRAINT FK_VISITFINDINGS_FINDINGS FOREIGN KEY (FINDINGSID)
    REFERENCES ALPHA.FINDINGS(FINDINGSID),
  CONSTRAINT FK_VISITFINDINGS_VISIT FOREIGN KEY (VISITID)
    REFERENCES ALPHA.VISITS(VISITID),
  CONSTRAINT PK_VISITFINDINGS PRIMARY KEY (ID))
TABLESPACE USERS
STORAGE (
  INITIAL 64K
  MAXEXTENTS UNLIMITED
)
LOGGING;
4

3 に答える 3

49

私はすでに回答のクレジットを与えていますが、他の誰かが自分の問題に対する回答を探しているときにこのアイテムを見つけた場合に備えて、ここで私の問題の根本が何であったかを正確に言及する価値があると思います.

問題は、Oracle のパラメーター化されたクエリの C# 実装に、深刻で潜在的に危険なバグが含まれていることです。

パラメータの名前は何でもかまいません。クエリに表示される順序で追加する必要があります。

詳しくはこちらをご覧ください

于 2010-10-06T21:51:19.737 に答える
5

パラメータをチェックしたというのはParameters、SqlCommand クラスのコレクションのことですか? SqlParameter ページのこのメモに違反している可能性があります。

SqlParameter コンストラクターのこのオーバーロードを使用して整数パラメーター値を指定する場合は注意してください。このオーバーロードは Object 型の値を取るため、次の C# の例に示すように、値がゼロの場合は整数値を Object 型に変換する必要があります。コピー

Parameter = new SqlParameter("@pname", Convert.ToInt32(0));

この変換を実行しない場合、コンパイラは、SqlParameter (文字列、SqlDbType) コンストラクターのオーバーロードを呼び出そうとしていると見なします。

次のようなものを使用することをお勧めします

cmd.Parameters.Add(
   new SqlParameter("Field1", SqlDbType.Int32) { Value = field1Val });

代わりに明示的にタイプを設定します。

于 2010-10-05T17:55:05.053 に答える
1
command.BindByName = true;

こちらの解説をご覧ください

于 2016-08-26T15:49:56.793 に答える