2017-08-04 71 views
0

我正在将数据从一个hsqldb传输到另一个hsqldb。两者都有相同的表格等。模式完全相同。PreparedStatement与hsqldb中的hextoraw引发java.sql.SQLDataException:数据异常:字符串数据,右截断

我有一些大规模的二进制列(不是我的设计决策,但我必须与它合作)。那些从数据库Arawtohex函数读取的字符串,并使用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

添加竞争stactrace请 – Jens

+0

看起来'hextoraw'的输出比列大小要长 – Jens

+0

@jens不,不是。我尝试使用随hsqldb提供的工具手动执行完全相同的语句,并且它的工作原理 – toydarian

回答

0

你可以尝试用readBinaryStreamwriteBinaryStream方法,而不是使用rawtohex,例如:

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数据库,而无需在施加大小检查一些场景。上面添加一些大小的检查代码会告诉你这是否发生,并允许你改变两个数据库中的列大小。

相关问题