SQLite中的update语句问题

时间:2011-05-31 15:06:49

标签: java sqlite

我使用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”是问题吗?

3 个答案:

答案 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()); 

你必须使用+