h2 getGeneratedKeys抛出异常

时间:2015-07-20 08:10:40

标签: java sql h2

我尝试将一些数据放入我的H2数据库,但我在数据库中总共有一个noob,因此它会在一个多小时后抛出错误。 Normaly我可以用某种方式解决它但现在我遇到了一个我试图使用的新问题 getGeneratedKeys()首先我尝试使用AUTO_INCREMENT(1,1),但这并没有起到太大的作用,但它不会起作用。

我的程序抛出的异常是

  

org.h2.jdbc.JdbcSQLException:Funktion" GETGENERATEDKEYS" nicht gefunden   功能" GETGENERATEDKEYS"未找到; SQL语句:   插入logTbl值(getGeneratedKeys(),Webservice-> startThread0:Thread0)[90022-173]

我的数据库函数看起来像这样

    public void createTable(String Log) {

    try {
        Class.forName("org.h2.Driver");
    } catch (ClassNotFoundException e) {
        System.err.println("TREIBER FEHLER");
        e.printStackTrace();
    }
    Connection conn = null;
    try {
        conn = DriverManager.getConnection("jdbc:h2:~/DBtest/Logs");

        Statement stat = conn.createStatement();


        stat.execute("CREATE TABLE IF NOT EXISTS logTbl(ID INT PRIMARY KEY, LOG VARCHAR(255))");

        //stat.execute("insert into test values(1, 'Hello')");
        for (int i = 0; i < 20; i++) {
            stat.execute("insert into logTbl values( getGeneratedKeys()," + Log + ")");
        }
            stat.close();
            conn.close();

    } catch (SQLException e) {
        System.err.println("SQL FEHLER");
        e.printStackTrace();
    }
}

希望你能帮助我解决我的错误,因为我说我完全是新的,只是有一些代码示例作为&#34;教程&#34;因为我没有找到一个好的教程

1 个答案:

答案 0 :(得分:2)

如果要自动生成主键值,则需要先更改表的定义:

CREATE TABLE IF NOT EXISTS logTbl
(
  ID integer AUTO_INCREMENT PRIMARY KEY, 
  LOG VARCHAR(255)
);

您还应该使用PreparedStatement而不是连接值。

所以你的Java代码看起来像这样:

String insert = "insert into logTbl (log) values(?)";
PreparedStatement pstmt = connection.prepareStatement(insert,  Statement.RETURN_GENERATED_KEYS);
pstmt.executeUpdate();
ResultSet rs = pstmt.getGeneratedKeys();
long id = -1;
while (rs.next()) 
{
   rs.getLong(1);
}

可能需要使用重载版本的prepareStatement()来提供要返回的列。不确定哪一个适用于H2:

prepareStatement(insert, new String[] {"ID"});

顺便说一下:作为varchar列的长度,没有任何关于255的“魔力”。 varchar(500),varchar(20)or varchar(255)之间没有性能差异。你应该使用你期望你需要的长度,而不是你认为更好的一些“魔法”限制。