Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC PreparedStatement.setString()不能与SQLite一起正常工作?_Java_Sqlite_Jdbc - Fatal编程技术网

Java JDBC PreparedStatement.setString()不能与SQLite一起正常工作?

Java JDBC PreparedStatement.setString()不能与SQLite一起正常工作?,java,sqlite,jdbc,Java,Sqlite,Jdbc,我使用的是Xerials SQLite JDBC驱动程序,我想做你能想象到的最简单的事情: 我创建了下表: CREATE TABLE IF NOT EXISTS households (hostname_id_pk INTEGER PRIMARY KEY, hostname TEXT UNIQUE, vm TEXT); 现在,由于我需要一个参数化的插入语句,我使用PreparedStation,如下所示: public static void main(String[] args) throw

我使用的是Xerials SQLite JDBC驱动程序,我想做你能想象到的最简单的事情:

我创建了下表:

CREATE TABLE IF NOT EXISTS households (hostname_id_pk INTEGER PRIMARY KEY, hostname TEXT UNIQUE, vm TEXT);
现在,由于我需要一个参数化的插入语句,我使用PreparedStation,如下所示:

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);
        }
    }

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

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

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


Thx提前

请更正以下行:

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


请更正以下行:

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


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

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

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

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

首先,gethouseholdsmt语句没有声明为PreparedStatement。
第二,您需要执行updateUpdate()您的updateHouseholdStmt的PreparedStatement(updateHouseholdStatement.executeUpdate();)

首先,getHouseholdStmt语句没有声明为PreparedStatement。
第二,您需要执行updateUpdate()您为UpdateHouseholdsmt准备的语句(updateHouseholdStatement.executeUpdate();)

dddaaarn。。。好的,谢谢,伙计们:)这就是当你站到床的另一边时会发生的事情。。。好的,谢谢,伙计们:)这就是当你站在床的另一边时会发生的事情。