2

Java JDBC コードを使用して SolidDB にレコードを追加しようとすると、次のエラーが発生します。

例外をスローするメソッドに従います。

    public void addData(User data) {
    Connection conn = null;
    try {
        conn = dataSource.getConnection();
        if (conn == null || conn.isClosed()) {
            throw new RuntimeException("Could not open connection");
        }
        String query="INSERT INTO USER "
                + "(ID, NAME, PASSWORD, ENABLED, REQUIRE_RESET)"
                + "VALUES (?, ?, ?, ?, ?);";

        PreparedStatement ps = conn.prepareStatement(query);
        // "ID" column is INTEGER, and partition field in UserData is int.
        ps.setString(1, data.getId());
        ps.setString(2, data.getName());
        ps.setString(3, data.getPassword());
        // "ENABLED" column is INTEGER, and enabled field in UserData is boolean.
        ps.setInt(4, data.isEnabled()? 1:0); 
        ps.setString(5, data.isRequireReset()?"Y":"N");
        if (ps.executeUpdate() < 1) {
            throw new RuntimeException("Could not save User, executeUpdate() returned a value < 1");
        }

    } Catch (SQLException e) {
        throw new DataLayerException("Could not save the User Data.", e);
    } finally {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
            }
        }
    }
}

値を直接ハードコーディングしてみましたが、それでも失敗します。そして、挿入ステートメントから「ID」と「ENABLED」列を削除すると、挿入は成功します。

前もって感謝します。

4

2 に答える 2

1

PreparedStatementインデックスは1 から始まります ( setXX javadocも参照)。0 を使用し、ドライバーが警告しないため、すべてが「シフト」されて問題が発生します。

修理:

ps.setString(1, data.getId());
ps.setString(2, data.getName());
ps.setString(3, data.getPassword());
ps.setInt(4, data.isEnabled()? 1:0); 
ps.setString(5, data.isRequireReset()?"Y":"N");
于 2015-08-21T15:03:53.640 に答える
1

最後に解決策を得ましたが、それは愚かな構文エラーが原因です。最後にセミコロンを取り除くと、うまくいきました!

于 2015-08-21T15:50:53.473 に答える