【问题标题】:h2 getGeneratedKeys throws exceptionh2 getGeneratedKeys 抛出异常
【发布时间】:2015-07-20 08:10:40
【问题描述】:

我尝试将一些数据放入我的 H2 数据库中,但我在数据库中完全是个菜鸟,所以它在一个多小时以来一直抛出错误。 通常我可以以某种方式修复它,但现在我遇到了一个我尝试使用的新问题 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();
    }
}

希望你能帮我解决我的错误,因为我说我是全新的,只是有一些代码示例作为“教程”,因为我没有找到好的教程

【问题讨论】:

  • getGeneratedKeys()PreparedStatement 类的Java 方法,它不是 SQL 函数,因此不能在SQL 语句中使用它。 See the JavaDocsJDBC tutorial 了解详情
  • 另见herehere
  • 啊,太好了,谢谢 :D 我会努力理解,但这并不容易

标签: java sql h2


【解决方案1】:

如果你想自动生成主键值,你需要先改变你的表的定义:

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) 之间没有性能差异。您应该使用您期望需要的长度,而不是您认为效果更好的“魔法”限制。

【讨论】:

  • 很好,谢谢 :D 几乎可以工作 我认为我可以自己完成的最后一项工作 呵呵 :D 。 Ahh oke 不知道 255 是数据库中的最大值,哈哈 :D 但我使用 log4j 的日志,所以我认为 100 会适合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 2011-02-25
相关资源
最近更新 更多