【问题标题】:JDBC PreparedStatement.setString() not working properly with SQLite?JDBC PreparedStatement.setString() 不能与 SQLite 一起正常工作?
【发布时间】:2014-02-24 13:54:32
【问题描述】:

我正在使用 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(...) 方法行一切正常。

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

提前谢谢。

【问题讨论】:

  • dddaaarn... 好的,谢谢大家 :) 当你从错误的床边起床时会发生这种情况。

标签: java sqlite jdbc


【解决方案1】:

请更正以下几行:

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

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

【讨论】:

    【解决方案2】:

    更新时,您设置和执行了错误的变量:

    getHouseholdStmt = con.prepareStatement(getHouseholdString);
    getHouseholdStmt.setString(1, "test1");
    
    updateHouseholdStmt = con.prepareStatement(updateHouseholdString);
    getHouseholdStmt.setString(1, "test1"); //updating the select query
    ResultSet hhRS = getHouseholdStmt.executeQuery(); //you're executing the select query again!
    

    应该是:

    getHouseholdStmt = con.prepareStatement(getHouseholdString);
    getHouseholdStmt.setString(1, "test1");
    
    updateHouseholdStmt = con.prepareStatement(updateHouseholdString);
    updateHouseholdStmt .setString(1, "test1"); //update stmt 
    ResultSet hhRS = updateHouseholdStmt .executeQuery(); //update stmt
    

    【讨论】:

      【解决方案3】:

      首先,getHouseholdStmt 语句未声明为 PreparedStatement。 其次,您需要为 updateHouseholdStmt(updateHouseholdStatement.executeUpdate();) 执行更新()您的 PreparedStatement

      【讨论】:

        猜你喜欢
        • 2018-11-10
        • 2014-07-01
        • 1970-01-01
        • 2016-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多