1

これが Oracle ODP.NET プロバイダーのバグなのかどうか知りたいです。パラメータ化された挿入ステートメントを作成しました。パラメータの 1 つに「:EMPNO」という名前を付けました。テストすると、値は「8000」になりました。データベースでは、EMPNO 列は varchar2(4 バイト) として定義されていました。ただし、挿入により次のエラーメッセージが表示されました

ORA-12899: 列"HR"."HR_DEPARTURE"."EMPNO"の値が大きすぎます(実際: 6、最大: 4)

いくつかのコード スニペットを次に示します。

"INSERT INTO HR.HR_DEPARTURE (EMPNO) ':EMPNO'"

次に、パラメーターを追加します

new OracleParameter(":EMPNO", OracleDbType.Varchar2) {Value = empNo ?? Convert.DBNull}

コマンドを作成し、パラメーターを追加します (複数のパラメーターがあったため、配列)

DbCommand cmd = Connection.CreateCommand();
cmd.Parameters.AddRange(sqlParams.ToArray());

私はいくつかの調査を行い、エンコーディングや、Oracle がデフォルトで (BindByName ではなく) 位置でバインドするという事実について検討しました。ただし、これらのいずれも問題を解決しませんでした。その後、暗闇で撮影し、パラメーター名を「:EMPN」に変更したところ、次のエラー メッセージが表示されました。

ORA-12899: 列"HR"."HR_DEPARTURE"."EMPNO"の値が大きすぎます(実際: 5、最大: 4)

これにより、クエリが機能するときにパラメーター名を「:EMP」に変更するようになりました。プロバイダーが C# のパラメーター名にデータベースの列サイズを適用しているのは非常に奇妙です。データベースのサイズは、値を強制する必要があります (「8000」は、すべてのテストで同じにしました)。

4

1 に答える 1

5

いいえ; 問題は、クエリが意味をなさないことです。

':EMPNO':EMPNOは、 5 文字の長さのリテラル値を持つ文字列です。

パラメータを参照するには、文字列リテラルを記述しないでください。

于 2015-05-13T20:53:54.673 に答える