Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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 将preparedstatement插入数据库-PSQL_Java_Postgresql_Jdbc - Fatal编程技术网

Java 将preparedstatement插入数据库-PSQL

Java 将preparedstatement插入数据库-PSQL,java,postgresql,jdbc,Java,Postgresql,Jdbc,这似乎是一个非常简单的问题,但我不知道我的问题是什么。我有一个addTask方法,它将一些信息添加到我们的数据库中,如以下代码所示: public static boolean addTask(String name, String question, int accuracy, int type){ StringBuilder sql = new StringBuilder(); sql.append("INSERT INTO tasks (name, question,

这似乎是一个非常简单的问题,但我不知道我的问题是什么。我有一个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,这可以确认没有向db写入任何内容。连接肯定连接到正确的数据库(我输入了一些其他println等来检查)。我试图插入一个新初始化的表,如下所示:

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()的代码:


其中
USER
PASSWORD
是类中的静态字段

您误解了的返回值

请仔细阅读:

返回:
true
如果第一个结果是
ResultSet
对象
false
如果第一个结果是更新计数或没有结果

因此,在
INSERT
查询中,它将返回完全预期的
false
。在
SELECT
查询中,它只返回
true
(但是您通常希望使用它,它直接返回
ResultSet

如果您对受影响的行感兴趣,请改用。它返回一个
int
,如下所示:

返回: (1)SQL数据操作语言(DML)语句的行数,或(2)不返回任何内容的SQL语句的行数为0

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



与具体问题无关:您的代码正在泄漏数据库资源。请仔细阅读

您误解了的返回值

请仔细阅读:

返回:
true
如果第一个结果是
ResultSet
对象
false
如果第一个结果是更新计数或没有结果

因此,在
INSERT
查询中,它将返回完全预期的
false
。在
SELECT
查询中,它只返回
true
(但是您通常希望使用它,它直接返回
ResultSet

如果您对受影响的行感兴趣,请改用。它返回一个
int
,如下所示:

返回: (1)SQL数据操作语言(DML)语句的行数,或(2)不返回任何内容的SQL语句的行数为0

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



与具体问题无关:您的代码正在泄漏数据库资源。请仔细阅读

旁注:您没有关闭已打开的资源(语句和连接)。能否共享
DbAdaptor.connect()
方法?因为您是说数据库中没有写入任何内容,所以请检查代码是否在事务下运行?检查连接对象@ArunPJohny的
setAutoCommit()
值我已经设置了
DbAdaptor.connect()
code,应该启用自动提交,我没有做任何更改。我已经更新了上面的代码,包括关闭资源,感谢您在postgres数据库中指出,您是否有多个架构?另一个注意事项:为什么在
connect()
方法中消除异常?假设您将异常传播给调用方,以便调用方知道在创建连接时出错。如果在创建连接时发生异常,则您的
addTask()
方法是
NullPointerException
的最佳候选方法。旁注:您没有关闭打开的资源(语句和连接)。您可以共享
DbAdaptor.connect()
方法吗?因为您是说数据库中没有写入任何内容,所以请检查代码是否在事务下运行?检查连接对象@ArunPJohny的
setAutoCommit()
值我已经设置了
DbAdaptor.connect()
code,应该启用自动提交,我没有做任何更改。我已经更新了上面的代码,包括关闭资源,感谢您在postgres数据库中指出,您是否有多个架构?另一个注意事项:为什么在
connect()
方法中消除异常?假设您将异常传播给调用方,以便调用方知道在创建连接时出错。如果在创建连接时发生异常,则您的
addTask()
方法是
NullPointerException
的一个很好的候选方法。感谢有关关闭的建议,我修改了代码以在完成后关闭资源。返回值是我刚刚插入的一个错误,现在我将它改回了justreturntrue;所有这些都可以在我更新的代码中看到。我仍然有一个问题,就是没有实际更新数据库。至于关闭,那应该在
最终
中发生。现在,当执行SQL查询时抛出异常时,它们仍然有泄漏的风险。至于实际的插入,这可能是由于连接没有提交(close隐式地做了这一点),或者只是查看了错误的DB或表或过时的视图;s、 执行(“从任务中选择id、名称”)s的结果集包含我初始化任务时使用的伪值(表中也绝对没有命名冲突)。感谢关于关闭的建议,我修改了代码,以便在完成后关闭资源。返回值是我刚刚插入的一个错误,现在我将它改回了justreturntrue;所有这些都可以在我更新的代码中看到。我仍然有一个问题,就是没有实际更新数据库。至于关闭,那应该在
最终
中发生。
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;
}