当前位置: 首页 > 面试题库 >

将PreparedStatement插入数据库-PSQL

姜晨
2023-03-14
问题内容

这似乎是一个非常简单的问题,但是我无法弄清楚我的问题是什么。我有一个方法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;
      }
}

我的问题是prepareStatement.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;
}

where USERPASSWORD是类中的静态字段


问题答案:

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

请仔细阅读javadoc:

返回值:

true如果第一个结果是ResultSet对象;false如果第一个结果是更新计数或没有结果。

因此,它的回报-因为完全在意料之中-
falseINSERT查询。它仅trueSELECT查询时返回(但是您通常希望使用该查询,executeQuery()而不是直接返回ResultSet)。

如果您对受影响的行感兴趣,请PreparedStatement#executeUpdate()改用。它返回一个int按的Javadoc:

返回值:

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

返回值等于或大于1则表示插入成功。



 类似资料:
  • 问题内容: 我想使用PreparedStatement将行插入表中。该表有3列(int,String,String)。关键是int列是AUTO_INCREMENT,所以我想将该变量保留为空,然后让数据库完成该工作(这是一个id)。还没有找到如何做! 这是一个MySQL数据库。 问题答案: 这是相对简单的,只需从列列表中删除自动增量列即可: 准备该语句,设置两个参数,然后在非查询模式下执行。

  • 问题内容: 我试图在不使用准备好的语句的情况下将一些Binary数据插入MySQL数据库。原因是我将成千上万条语句连接到一个插入中,一次运行一次。(MySQL转储和导入的工作原理) 我已经尝试了以下语句,但是都失败了: 插入my_table值(1,’g = F| }X ‘,2); 插入my_table值(1,CAST(’g = F| }X ‘as BINARY),2); 插入my_table值(1

  • 本文向大家介绍Android 将数据插入数据库,包括了Android 将数据插入数据库的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 事情是这样的 我不知道发生了什么,如果有人能帮忙,我会非常感激的。THX!

  • 问题内容: 我希望能够将bigints数组写入要用于Go历史记录的表中。不幸的是,我不能,当我这样做时`sql: converting Exec argument 这是我要插入的表的结构: 问题答案: 使用自定义类型实现database / sql / driver.Valuer:

  • 问题内容: 我想在我的MySQL数据库中插入整数188和90,但以下代码不起作用: 为什么不起作用? 问题答案: 编辑 为我工作: 在MySQL表;