1

次のような SQL 準備済みステートメントを設定しています。

prd.setBytes(i+1, temp_value);

temp_value は byte[] 型です。

最後に、次のように prd ステートメントをバッチに追加しています。

prd.addBatch();
prd.executeBatch();

executeBatch で例外が発生します: java.sql.BatchUpdateException: データ型 varbinary を数値に変換中にエラーが発生しました。

DataBase テーブルのフィールドのタイプが Numeric であるか、その他のタイプであるかに関係なく、単純に Bytes を準備済みステートメントに追加することは可能ですか?

挿入するタイプについて具体的に説明する必要がありますか?

4

2 に答える 2

2

このメソッドは、setBytes、 などの SQL BLOB タイプで使用するためのものです。数値型の場合、 、、または数値プリミティブを使用する必要があります。varbinarylongvarbinaryBigDecimalBigInteger

非バイナリ型での使用を許可setBytesすることの問題は、システムの独立性です。JDBC ドライバーの作成者が公開する必要がある非常に複雑な構造を持つ可能性のあるマルチバイト数のドライバーの予想されるレイアウトを一致させる必要があります。このレイアウトが公開されると、ドライバーはそのレイアウトとの互換性を維持する必要があります。ただし、ほとんどのドライバー作成者は、クライアント コードとのこのような緊密な結合を避けることを好みます。

于 2012-12-02T12:25:09.953 に答える
1

JDBC 4.1 仕様の付録 B (データ型変換テーブル) には、JDBC ドライバーが実装する必要があるすべての変換 (サポートされている型について) が一覧表示されています。具体的には、表 B-4 に Java オブジェクト型から JDBC 型へのマッピングを示し、表 B-5 に の変換マトリックスを示しますsetObject()。の場合、JDBC ドライバは、とbyte[]の間の変換をサポートするためにのみ必要です。BINARYVARBINARYLONGVARBINARY

したがって、JDBC 仕様に基づいて、setBytes()他のデータ型には使用できません。他のタイプにも使用できるドライバーがありますsetBytes()が、それはドライバー固有であるため、その変換に依存するべきではありません。表示されるエラー メッセージは、ドライバーがこの変換をサポートしていないことを明確に示しています。

また、特定のタイプについては、特定のデータベースで有効なシーケンスでNUMERICどのように表現できるか疑問に思うはずです。byte[]

于 2012-12-02T12:26:24.233 に答える