Java SQLite(JDBC)未写入数据
我有一个应用程序,可以将数据读写到sqlite数据库。在某些情况下,我必须写入一些数据,并在数据库中读取这些数据。见下面的例子Java SQLite(JDBC)未写入数据,java,sqlite,jdbc,Java,Sqlite,Jdbc,我有一个应用程序,可以将数据读写到sqlite数据库。在某些情况下,我必须写入一些数据,并在数据库中读取这些数据。见下面的例子 public void read() throws SQLException { Connection c = DriverManager.getConnection("jdbc:sqlite:C:\\test.sqlite"); c.setAutoCommit(false); try { PreparedStatemen
public void read() throws SQLException {
Connection c = DriverManager.getConnection("jdbc:sqlite:C:\\test.sqlite");
c.setAutoCommit(false);
try {
PreparedStatement p = c.prepareStatement("SELECT * FROM test");
try {
ResultSet rs = p.executeQuery();
try {
while (rs.next()) {
System.out.println(rs.getInt("val"));
}
} finally {
rs.close();
}
} finally {
p.close();
}
} finally {
c.close();
}
}
public void write() throws SQLException {
Connection c = DriverManager.getConnection("jdbc:sqlite:C:\\test.sqlite");
c.setAutoCommit(false);
try {
PreparedStatement p = c.prepareStatement("INSERT INTO test (val) VALUES (?)");
try {
p.setDouble(1, Math.random());
p.executeUpdate();
c.commit();
} finally {
p.close();
}
} finally {
c.close();
}
}
public void demonstrate() {
write();
read();
}
如果调用display
方法,数据写入时不会出现任何异常,但是read方法在stdout上不会输出任何内容。如果我重新启动应用程序,我就能看到上次运行时写入的数据。
上述示例已简化。在实际应用程序中,每个查询需要编写的数据要多得多
那么为什么SQLite看不到当前会话中写入的数据呢?我注意到您正在使用驱动程序管理器获取SQLConnection。 您可能忘记在驱动程序管理器中注册SQL驱动程序。 您的代码中应该有类似的内容(只需执行一次): 编辑: 您的代码中有一个小错误:您正在编写double和读取int。 为了进行测试,我创建了一个表“test”,其中包含类型为double的列“val” 每次运行程序时,输出中都会写入一行新行:
0
0
0
这是运行程序3次后的输出。数据库有3行,每次我运行程序时,都会再添加一行(0值是因为您从一个双精度值读取int,随机返回一个介于0和1之间的值)
我唯一的解释可能是您的SQLite驱动程序中有一个bug
>那么为什么SQLite看不到当前会话中写入的数据呢?由于您正在关闭连接,并在每次读写内容时重新打开连接,因此它不再是同一个会话。但我想问题是驱动程序管理器无法解析您的连接URL,并且文件中没有任何内容。您有任何SQLException吗?没有任何异常。一旦我关闭应用程序,数据就会被写入。如果没有,重启后它就不在了。如果我使用sqlite命令行工具进行选择,在关闭我的应用程序之前,我也看不到数据。如果使用
classForName
加载驱动程序,则无需注册驱动程序。否则会有例外。是的,你是对的。您可以手动注册驱动程序,或者使用classForName加载驱动程序类,驱动程序将向驱动程序管理器注册自身。我目前正在尝试运行您的代码,看看是否可以复制该问题。您的代码对我来说运行正常,无法复制该问题。请参阅上面对我的答案的编辑。问题可能是您的sqlite驱动程序。
0
0
0