我需要在我的数据库中插入一个十六进制值与Java中的PreparedStatement。
我可以用Hex函数来选择我的值:
String id = "02658947530232010038892587183C";
String request = "SELECT HEX(COLUMN) FROM TABLE WHERE HEX(COLUMN)=?";
Connection con = getConnectionDb2z();
ResultSet rs = null;
try(PreparedStatement select = con.prepareStatement(request))
{
insert.setString(1, id);
rs = select.executeQuery();
rs.next();
System.out.println(rs.getString("COLUMN"));
}
catch(SQLException e)
{
throw e;
}
finally
{
con.close();
}
我的结果是02658947530232010038892587183C.
(这是一个例子)。
但是现在我想在我的表中插入一个值。如果我尝试:
String id = "02658947530232010038892587183C";
String request = "INSERT INTO TABLE (COLUMN) VALUES (X'?')";
Connection con = getConnectionDb2z();
try(PreparedStatement insert = con.prepareStatement(request))
{
insert.setString(1, id);
insert.executeUpdate();
}
Java不能识别"(X'?') '中的?
参数,我有一个错误:
线程"main"异常com.ibm.db2.jcc.am。SqlSyntaxErrorException: invalid parameter.
如果我尝试:
String id = "X'02658947530232010038892587183C'";
String request = "INSERT INTO TABLE (COLUMN) VALUES (?)";
Connection con = getConnectionDb2z();
try(PreparedStatement insert = con.prepareStatement(request))
{
insert.setString(1, id);
insert.executeUpdate();
}
我也得到一个错误:
线程"main"异常com.ibm.db2.jcc.am。SqlDataException: DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001
因为它试图将X'02658947530232010038892587183C'
作为字符串插入。
我发现工作的唯一方法是:
String id = "02658947530232010038892587183C";
String request = "INSERT INTO TABLE (COLUMN) VALUES (X'?')";
Connection con = getConnectionDb2z();
try(PreparedStatement insert = con.prepareStatement(request.replace("?", id))
{
insert.executeUpdate();
}
然而,这种方法是不可行的。有什么方法可以正确地做到这一点?
提醒一下,我的数据库是DB2 Z/OS, UNHEX函数不存在
更多说明:
在我的请求中,X'?'
是一个用于打包十六进制值的函数。
长度COLUMN
在我的TABLE
是7。我的长度id
是14,我需要打包这个id插入他在我的bdd。当我想在java代码中读取它时。
我用HEX(id)
函数解包id。但是在DB2 Z/OS中,函数UNHEX
不存在,我们需要使用X'id'
,但是正如您所看到的,PreparedStatement
不将其识别为函数。
当我用X''
函数包装此id02658947530232010038892587183C
时,数据库中SELECT COLUMN FROM TABLE
的结果是Áiåë�i g
(您看到的结果不是我得到的确切结果,因为有网站无法读取的字符)。
如果我在我的选择中使用HEX()
函数来解包idSELECT HEX(COLUMN) FROM TABLE
,结果将是我更新了我的问题,以显示当我打包我的id时我需要得到什么。02658947530232010038892587183C
.
为什么不直接从Java转换过来呢?
String id = "0038892587183C";
int idAsInt=Integer.parseInt(id, 16);
String request = "INSERT INTO TABLE (COLUMN) VALUES (?)";
Connection con = getConnectionDb2z();
try(PreparedStatement insert = con.prepareStatement(request))
{
insert.setInt(1, idAsInt);
insert.executeUpdate();
}
这将id
从十六进制转换为int
,Integer.parseInt
使用自定义基础16
,以便将其解析为十六进制数。
则使用PreparedStatement#setInt
设置参数,不使用X''
。
如果十六进制数超过int
的signed 32位限制,则需要使用long
(signed 64位)或BigInteger
。不幸的是,JDBC不允许直接传递BigInteger
,因此您需要使用下面提到的解决方案:
String id = "0038892587183C";
BigInteger idAsBigInt=new BigInteger(id, 16);//parse it to a BigInteger
String request = "INSERT INTO TABLE (COLUMN) VALUES (?)";
Connection con = getConnectionDb2z();
try(PreparedStatement insert = con.prepareStatement(request))
{
insert.setBigDecimal(1, new BigDecimal(idAsBigInt));//or possibly insert.setString(1, String.valueOf(idAsBigInt));
insert.executeUpdate();
}