我正在使用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);
}
}
}
在这种情况下,我在DB中唯一可以找到的是(1, , VM1)
的新条目,意味着创建了条目,但由于某种原因缺少字符串参数。
当我更换“?”时在带有示例值的updateHousholdStatement()
中删除.setString(...)
方法行,一切正常。
我错过了什么?!我今天早上已经检查了一千次。
提前谢谢。答案 0 :(得分:2)
请更正以下内容:
updateHouseholdStmt = con.prepareStatement(updateHouseholdString);
getHouseholdStmt.setString(1, "test1");
到
updateHouseholdStmt = con.prepareStatement(updateHouseholdString);
updateHouseholdStmt.setString(1, "test1");
答案 1 :(得分: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
答案 2 :(得分:0)
首先,getHouseholdStmt语句未声明为PreparedStatement。 其次,你需要executeUpdate()你的PreparedStatement for updateHouseholdStmt(updateHouseholdStatement.executeUpdate();)