2017-08-04 5 views
0

データを1つのhsqldbから別のものに転送しています。どちらも同じテーブルなどを持っています。スキーマは完全に同一です。hsqldbのhextorawを使用したPreparedStatementがjava.sql.SQLDataExceptionをスローします。データ例外:文字列データ、右切り捨て

大規模なバイナリカラムがあります(私の設計決定ではありませんが、私はそれに取り組まなければなりません)。それらはAデータベースからrawtohex関数を使って文字列として読み取って、hextoraw関数を使ってデータベースBに書き込みます。カラムはデータに対して小さすぎる場合

String query = "SELECT rawtohex(PAYLOAD) FROM TABLE_X;" 
Statement selectPst = connA.createStatement(); 
ResultSet data = selectPst.executeQuery(query); 

String insert = "INSERT INTO TABLE_X (PAYLOAD) VALUES (hextoraw(?))"; 
PreparedStatement insStmt = connB.prepareStatement(insert); 

data.next(); 
insStmt.setString(1, data.getString(1)); 

insStmt.executeUpdate(); // <- java.sql.SQLDataException: data exception: string data, right truncation 

通常、この例外がスローされます。

コードは、そのようなものになります。しかし、データは同じテーブルとカラムを持つデータベース内にあり、同じことをhsqldbツールを使って手動で行うと動作します。

これはおそらく何が起こる可能性があるのか​​、私は何らかのアイデアに感謝しています!

+0

競合戦略を追加してください – Jens

+0

'hextoraw'の出力が列サイズ – Jens

+0

よりも長いようですが、それはそうではありません。私はhsqldbで提供されているツールを使用して、まったく同じステートメントを手動で実行しようとしましたが、 – toydarian

答えて

0

あなたが例えば、代わりにrawtohexを使用してのreadBinaryStreamwriteBinaryStream方法を試すことができます。:

String query = "SELECT PAYLOAD FROM TABLE_X;" 
Statement selectPst = connA.createStatement(); 
ResultSet data = selectPst.executeQuery(query); 

String insert = "INSERT INTO TABLE_X (PAYLOAD) VALUES (?)"; 
PreparedStatement insStmt = connB.prepareStatement(insert); 

data.next(); 
insStmt.setBinaryStream(1, data.getBinaryStream(1)); 

insStmt.executeUpdate(); 
+0

はすでにそれを試して、動作しません... – toydarian

0

RAWTOHEXとHEXTORAWを使用する必要はありません。

String query = "SELECT PAYLOAD FROM TABLE_X;" 
Statement selectPst = connA.createStatement(); 
ResultSet data = selectPst.executeQuery(query); 

String insert = "INSERT INTO TABLE_X (PAYLOAD) VALUES (?)"; 
PreparedStatement insStmt = connB.prepareStatement(insert); 

data.next(); 
byte[] databytes = data.getBytes(1); 

// add code here to check if (databytes.length > columnSize) 
insStmt.setBytes(1, databytes); 

insStmt.executeUpdate(); // 

、データサイズチェックが適用されずconnAデータベースに挿入されたいくつかのシナリオにおいて可能です。上記のサイズチェックコードを追加すると、これが発生した場合に表示され、両方のデータベースの列サイズを変更できるようになります。

関連する問題