0

私はこれを使ってウェブ全体を調べましたが、探していることを行う方法が見つからないことに驚いています.

非推奨のライブラリではなくOracle.DataAccess.Client、C# プロジェクトでライブラリを使用していますSystem.Data.OracleClient.

私は非常に単純なテーブルを持っています:

CREATE TABLE testing (
      ID NUMBER(10),
      COMMENTS CLOB,
      DATECREATED   DATE DEFAULT (SYSDATE) NOT NULL,
      DATEMODIFIED  DATE
);

INSERT INTO testing (ID, COMMENTS) VALUES(1, 'this is a test');

上記は明らかにうまく機能します。問題は、これがコメント フィールドであるため、変更されることです。私の C# プログラムでは、ユーザーがコメントを保存できるようにしたいと考えています。この例では、複雑なものをすべて削除しています。

フォームにボタンと「コメント」というテキストボックスがあります。

using (OracleConnection connection = new OracleConnection(<VALID CONN STRING GOES HERE>)) {
    connection.Open();
    using (OracleCommand command = new OracleCommand()) {
         command.Connection = connection;
         command.CommandText = "UPDATE testing SET COMMENTS = :COMMENTS, DATEMODIFIED = sysdate WHERE ID = :ID";
         command.CommandType = CommandType.Text;
         command.Parameters.Add("ID", OracleDbType.Int32, ParameterDirection.Input).Value = 1;
         command.Parameters.Add("COMMENTS", OracleDbType.Clob, ParameterDirection.Input).Value = comments.Text;
         command.ExecuteNonQuery();
    }
}

したがって、基本的に、このコードは、Clob を書き込もうとしない限り機能します。変更日を保存すると、期待どおりに作成されます。ただし、Clob で保存しても何も起こりません。オラクルからのエラーメッセージも例外も何もありません。

パラメータ化を忘れて間違った方法で行った場合:

command.CommandText = "UPDATE testing SET COMMENTS = " + comments.Text + ", DATEMODIFIED = sysdate";

問題はない。ここではパラメータ化が問題のようです。

4

3 に答える 3

1

ODP .NET のバインドを順不同で使用するには、この追加コマンドを指定する必要があります (より適切な方法) 以前に Microsoft のプロバイダーを使用していた場合、これは必要ありませんでした。

Command.BindByName = true;

コメントで > 32K を使用して更新をテストし、エラーが発生するかどうかを確認できますか?

于 2014-01-16T14:34:32.040 に答える
1

パラメータ化が問題だったという点で私は正しかったことがわかりましたが、それは非常に基本的な間違いだったと言えます。とにかく、ステートメントは実際には完全に正常に実行されていましたが、パラメーターが順不同で追加されていました。

次のコードでは、ID が最後のパラメーター (where 句) であるため、最後に追加されていることに注意してください。

using (OracleConnection connection = new OracleConnection(<VALID CONN STRING GOES HERE>)) {
    connection.Open();
    using (OracleCommand command = new OracleCommand()) {
         command.Connection = connection;
         command.CommandText = "UPDATE testing SET COMMENTS = :COMMENTS, DATEMODIFIED = sysdate WHERE ID = :ID";
         command.CommandType = CommandType.Text;
         command.Parameters.Add("COMMENTS", OracleDbType.Clob, ParameterDirection.Input).Value = comments.Text;
         command.Parameters.Add("ID", OracleDbType.Int32, ParameterDirection.Input).Value = 1;
         command.ExecuteNonQuery();
    }
}
于 2013-04-26T19:18:51.340 に答える
0

私の経験から、次のように文字列を文字配列に変換することにより、このコンテキストで Oracle CLOB に書き込むことができます。

String input = "string value";

OracleParameter parm = new OracleParameter("parameter_name", OracleDbType.Clob);
parm.Direction = ParameterDirection.Input;
parm.Value = input.toCharArray();

CLOB はキャラクタ ラージ オブジェクトであるためです。

于 2014-05-27T14:51:42.963 に答える