java - JDBCPreparedStatement.setString() 无法与 SQLite 一起正常工作?

标签 java sqlite jdbc

我正在使用 Xerials SQLite JDBC 驱动程序,并且想要做您能想象到的最简单的事情:

我创建了下表:

CREATE TABLE IF NOT EXISTS households (hostname_id_pk INTEGER PRIMARY KEY, hostname TEXT UNIQUE, vm TEXT);

现在,因为我想要一个参数化的插入语句,所以我使用PreparedStatment,如下所示:

public static void main(String[] args) throws ClassNotFoundException {
    Class.forName("org.sqlite.JDBC");
    Connection con = null;
    PreparedStatement updateHouseholdStmt = null;

    try {
        con = DriverManager.getConnection(DB_IDENTIFIER);           

        String getHouseholdString = "SELECT hostname_id_pk FROM households WHERE hostname = ?";
        String updateHouseholdString = "INSERT INTO households (hostname, vm) values(?, 'VM1')";

        getHouseholdStmt = con.prepareStatement(getHouseholdString);
        getHouseholdStmt.setString(1, "test1");

        updateHouseholdStmt = con.prepareStatement(updateHouseholdString);
        getHouseholdStmt.setString(1, "test1");

        ResultSet hhRS = getHouseholdStmt.executeQuery();
        int hhId = -1;

        if(hhRS.next()){
            hhId = hhRS.getInt(1);
            System.out.println(hhId);
        } else {
            System.out.println(updateHouseholdStmt.executeUpdate());
        }

    } catch (SQLException e) {
        System.err.println(e.getMessage());
    } finally {
        try {
            if (con != null) {
                con.close();
            }
            if (getHouseholdStmt != null){
                getHouseholdStmt.close();
            }
            if (updateHouseholdStmt != null) {
                updateHouseholdStmt.close();
            }
        } catch (SQLException e) {
            System.err.println(e);
        }
    }

}

在这种情况下,我在数据库中唯一能找到的是一个带有 (1, , VM1) 的新条目,这意味着该条目已创建,但由于某种原因缺少字符串参数.

当我替换“?”时在 updateHousholdStatement() 中使用示例值并删除 .setString(...) 方法行,一切正常。

我到底错过了什么?!今天早上我已经检查了一千遍了。

提前谢谢。

最佳答案

请更正以下行:

updateHouseholdStmt = con.prepareStatement(updateHouseholdString);
getHouseholdStmt.setString(1, "test1");

updateHouseholdStmt = con.prepareStatement(updateHouseholdString);
updateHouseholdStmt.setString(1, "test1");

关于java - JDBCPreparedStatement.setString() 无法与 SQLite 一起正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21989816/

相关文章:

java - 使用分页从redis缓存中检索数据

java - 验证内部包含 null 元素的 null 集合

java - 无法加载库 'tesseract' : libtesseract. 所以:无法打开共享对象文件:没有这样的文件或目录

Android - 从 SQLite 数据库获取结果集,然后用于 OpenCSV

python - 使用 Python 将整个 JSON 转换为一个 SQLite 字段

java - 我怎样才能最有效地计算列表/集合差异

java - Android 数据库中的 ClassCastException

java - 来自 executeQuery 的 "."附近的 JDBC 语法不正确

java - ResultSet 关闭后不允许执行操作[SQL 异常]

java - 如何使用java复制整个数据库方案