h2 getGeneratedKeys 抛出异常
h2 getGeneratedKeys throws exception
我尝试将一些数据放入我的 H2 数据库中,但我对数据库完全是一个菜鸟,所以一个多小时以来它一直在错误地抛出错误。
通常我可以以某种方式修复它但现在我遇到了一个新问题我尝试使用
getGeneratedKeys() 首先我尝试使用 AUTO_INCREMENT(1,1) 但这并没有起作用,但它不会正常工作。
我的程序抛出的异常是
org.h2.jdbc.JdbcSQLException: Funktion "GETGENERATEDKEYS" nicht gefunden
Function "GETGENERATEDKEYS" not found; SQL statement:
insert into logTbl values( 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();
}
}
希望你能帮我解决我的错误,因为我说我是全新的,只是有一些代码示例 "tutorial" 因为我没有找到好的教程
如果你想自动生成主键值,你需要先改变你的定义 table:
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"});
顺便说一句:"magic" varchar 列的长度大约为 255。 varchar(500)
、varchar(20)or varchar(255)
之间没有性能差异。您应该使用您期望的长度,而不是您认为性能更好的一些 "magic" 限制。
我尝试将一些数据放入我的 H2 数据库中,但我对数据库完全是一个菜鸟,所以一个多小时以来它一直在错误地抛出错误。 通常我可以以某种方式修复它但现在我遇到了一个新问题我尝试使用 getGeneratedKeys() 首先我尝试使用 AUTO_INCREMENT(1,1) 但这并没有起作用,但它不会正常工作。
我的程序抛出的异常是
org.h2.jdbc.JdbcSQLException: Funktion "GETGENERATEDKEYS" nicht gefunden Function "GETGENERATEDKEYS" not found; SQL statement: insert into logTbl values( 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();
}
}
希望你能帮我解决我的错误,因为我说我是全新的,只是有一些代码示例 "tutorial" 因为我没有找到好的教程
如果你想自动生成主键值,你需要先改变你的定义 table:
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"});
顺便说一句:"magic" varchar 列的长度大约为 255。 varchar(500)
、varchar(20)or varchar(255)
之间没有性能差异。您应该使用您期望的长度,而不是您认为性能更好的一些 "magic" 限制。