我使用SQLite创建了一个数据库。我想更新“功能”列的值(类型Blob)...但我不知道如何编写“更新”语句。 这就是我的尝试:
try {
stat = conn.createStatement();
} catch (SQLException e) {
}
try {
byte[] b = getFunction();
stat.executeUpdate("update table set features="+b);
} catch (SQLException e) {
}
我得到了以下错误:
java.sql.SQLException: unrecognized token: "[B@13a317a"
所以我猜“b”是问题吗?
答案 0 :(得分:5)
[B @ 13a317a看起来像一个数组到字符串结果(在这种情况下是b.toString())。您应该为blob使用准备好的语句,如:
update table set features=?
一个例子是here。
通常,您不应该通过连接字符串来创建SQL。这是SQL注入问题的秘诀。
答案 1 :(得分:3)
使用PreparedStatement尝试这个:
Connection con = null;
PreparedStatement stmt = null;
try {
byte[] b = getFunction();
con = ...;
stmt = con.prepareStatement("update table set features=?");
stmt.setBytes(1, b);
stmt.executeUpdate();
con.commit();
}
catch (SQLException e) {
//handle exception (consider con.rollback()) and con maybe null here)
}
finally {
//close stmt and at least con here (all maybe null here)
}
我个人总是使用PreparedStatements。当您必须编写大量此代码时,请考虑编写一些实用程序类来减少Boilerplate-Code。
特别是在处理普通JDBC时,应考虑在Connection,Statement和ResultSet方法上编写Utilty-Classes用于null安全调用方法。
修改强> Thomas Jung撰写的关于防止SQL注入的文章是另一个总是使用PreparedStatements的专业人士。为他+1: - )
答案 2 :(得分:-1)
stat.executeUpdate("update table set features="+b[0].toString());
你必须使用+