gpt4 book ai didi

java - 将准备好的语句插入数据库 - PSQL

转载 作者:行者123 更新时间:2023-11-29 14:05:20 26 4
gpt4 key购买 nike

这似乎是一个非常简单的问题,但我无法弄清楚我的问题是什么。我有一个方法 addTask,它将一些信息添加到我们的数据库中,如以下代码所示:

public static boolean addTask(String name, String question, int accuracy, int type){
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO tasks (name, question, type, accuracy) ");
sql.append("VALUES(?, ?, ?, ?)");
try {
Connection c = DbAdaptor.connect();
PreparedStatement preparedStatement = c.prepareStatement(sql.toString());
preparedStatement.setString(1, name);
preparedStatement.setString(2, question);
preparedStatement.setInt(3, type);
preparedStatement.setInt(4, accuracy);
preparedStatement.execute();
preparedStatement.close();
c.close();
return true;
}
catch (SQLException e) {
e.printStackTrace();
return false;
}
}

我的问题是 preparedStatement.execute() 总是返回 false,表明信息还没有被添加到数据库中。我可以运行 psql,这确认没有任何内容写入数据库。连接肯定连接到正确的数据库(我放入一些其他 printlns 等来检查这个)。我正在尝试插入一个新初始化的表,如下所示:

CREATE TABLE tasks
(
id SERIAL PRIMARY KEY,
submitter INTEGER REFERENCES accounts (id),
name VARCHAR(100) NOT NULL,
question VARCHAR(100) NOT NULL,
accuracy INTEGER NOT NULL,
type INTEGER REFERENCES types (id),
ex_time TIMESTAMP,
date_created TIMESTAMP
);

DbAdaptor.connect() 的代码:

public static Connection connect(){
try {
Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Properties properties = new Properties();
properties.setProperty("user", USER);
properties.setProperty("password", PASSWORD);
try {
return DriverManager.getConnection(URL, properties);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}

其中USERPASSWORD是类中的静态字段

最佳答案

你误解了PreparedStatement#execute()的返回值.

请仔细阅读the javadoc :

Returns:

true if the first result is a ResultSet object; false if the first result is an update count or there is no result.

因此,它在 INSERT 查询中返回——正如完全预期的那样——false。它仅在 SELECT 查询上返回 true(但您通常喜欢使用 executeQuery() 而不是直接返回 ResultSet) .

如果您对受影响的行感兴趣,请使用 PreparedStatement#executeUpdate()反而。它根据 the javadoc 返回一个 int :

Returns:

either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing

返回值 1 或更大表示插入成功。


与具体问题无关:您的代码正在泄漏数据库资源。请仔细阅读How often should Connection, Statement and ResultSet be closed in JDBC?

关于java - 将准备好的语句插入数据库 - PSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14016677/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com