2

PreparedStatementクラスを使用した次のSQLクエリでは、次のようになります。

String query_descrip = "insert into timitemdescription (itemkey, languageid, longdesc, shortdesc) values (?, 1033, ?,?)";
PreparedStatement pstmt2 = con.prepareStatement(query_descrip); 
pstmt2.setInt(1, rs4);
pstmt2.setString(2, itemdescription);
pstmt2.setString(3, itemdescription.substring(0,39));
pstmt2.executeUpdate();       

アイテムの説明にアポストロフィと一重引用符と二重引用符が含まれることがあります。たとえば、最近の1つのアイテムの問題は「Planar22」モニターです。もちろん、文字列は誤って解釈され、説明の値は「Planar22」だと思っていました。文字列内の特殊文字を処理する最良の方法は何ですか。

一部の人々が正規表現を使用していることを読みましたが、これらはケースバイケースで固有のようです。私が取り組んでいるもう1つの方法は、文字列配列を1文字ずつ読み取ることです。これを行うには、より効率的でリソースをあまり消費しない方法があることを望んでいました。

更新いくつかのより広範なテストの後、私のコードでより多くの問題が発生していることがわかりました。これはURLエンコードの問題でもありました。htmlフォームにjspコードが入力されている場合、説明フィールドをオンラインフォームに移動しようとし、クエリではなくフォーム上で切り捨てられます。jTDSは、特殊文字の受信に関する問題も修正しました。jTDSはjarであるため、マシンの再起動を回避するのにも役立ちました。それが私が部分的に使用したものだったので、私はjTDSスレッドに賞金を授与します。

前もって感謝します

4

4 に答える 4

15

PreparedStatementを使用しているため、何もする必要はありません。JDBCドライバーによって処理されます。注意しなければならないのは非ASCII文字だけです。具体的には、DBテーブルが、使用するすべての文字を処理できるテキスト列のエンコーディングを使用していることを確認する必要があります。しかし、これはSQLの問題であり、Javaの問題ではありません。

于 2009-05-26T17:31:05.717 に答える
3

これらの文字をパラメーターとしてPreparedStatementにバインドする場合は、これらの文字を特別に処理する必要はありません。これは、プリペアドステートメントアプローチの主な利点の1つです。

于 2009-05-26T17:31:42.940 に答える
3

他の人が言っているように、特殊文字を処理するために何もする必要はありません。別のJDBCドライバーを試す必要があります。

jTDSドライバーを使用してみて、PreparedStatementに役立つかどうかを確認してください。これは、SQLServer用のオープンソースデータベースドライバーです。私は今仕事でそれを使用しています、そしてそれはチャンピオンのように機能し、MSドライバーとは異なり実際にはJDBC仕様に準拠しています。

于 2009-05-29T02:52:59.907 に答える
0

問題はあなたが投稿したコードにあるのではないと私はかなり確信しています。トラブルシューティングに役立てるには:

  1. 上記のコードスニペットをデバッガーで実行してみましたか?データベース呼び出しに渡す前の「itemdescription」の値は何ですか?
  2. データベースの値を実際にどのように検証していますか?これはもっとJavaコードですか?それとも、SQLCMDなどで見ていますか?
于 2009-06-01T12:50:25.787 に答える