我尝试将一些数据放入我的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;因为我没有找到一个好的教程
答案 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)
之间没有性能差异。你应该使用你期望你需要的长度,而不是你认为更好的一些“魔法”限制。