我尝试将一些数据放入我的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();
}
}
希望您能帮我解决错误,因为我说我是个新手,只是有一些代码示例为“ tutorial”,因为我找不到很好的教程
最佳答案
如果要自动生成主键值,则需要首先更改表的定义:
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)
之间没有性能差异。您应该使用期望的长度,而不是您认为性能更好的“魔术”限制。