0

これは本当に単純な問題のように思えますが、私の問題が何であるかを理解することはできません。このコードに見られるように、データベースにいくつかの情報を追加するメソッド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()のコード:

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

ここでUSER、およびPASSWORDはクラスの静的フィールドです

4

1 に答える 1

6

の戻り値を誤解していますPreparedStatement#execute()

javadocをよく読んでください:

戻り値:

true最初の結果がResultSetオブジェクトの場合。false最初の結果が更新カウントであるか、結果がない場合。

したがって、完全に予想どおりfalseINSERTクエリで返されます。クエリでのみ返さtrueれます(ただし、通常は直接返す代わりSELECTに使用したい)。executeQuery()ResultSet

影響を受ける行に関心がある場合は、PreparedStatement#executeUpdate()代わりに使用してください。javadocintに従ってを返します。

戻り値:

(1) SQL データ操作言語 (DML) ステートメントの行数、または (2) 何も返さない SQL ステートメントの場合は 0

1 以上の戻り値は、挿入が成功したことを示します。


具体的な問題とは関係ありません: コードが DB リソースをリークしています。JDBC で Connection、Statement、および ResultSet を閉じる頻度をよくお読みください。

于 2012-12-24T03:23:30.523 に答える