【问题标题】:SQLite (JDBC) not writing dataSQLite (JDBC) 不写入数据
【发布时间】:2012-07-06 21:41:44
【问题描述】:

我有一个应用程序可以读取和写入数据到 sqlite 数据库。在某些情况下,我必须写入一些数据,并在数据库中读取这些数据。请参见下面的示例。

    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();
}

如果我调用demonstrate 方法,数据会毫无例外地写入,但读取方法不会在标准输出上输出任何内容。如果我重新启动应用程序,我可以看到上次运行中写入的数据。 上面显示的示例已简化。在实际应用中,每个查询要写入的数据要多得多。

那么为什么 SQLite 看不到当前会话中写入的数据呢?

【问题讨论】:

  • > 那么为什么SQLite 看不到当前会话中写入的数据呢?由于您关闭连接并在每次读取或写入内容时再次重新打开它,因此不再是同一个会话。但我想问题是驱动程序管理器无法解析您的连接 URL,并且文件中没有真正写入任何内容。你有任何 SQLException 吗?
  • 没有例外。一旦我关闭应用程序,数据就会被写入。如果没有,它不会在重新启动后出现。如果我使用 sqlite 命令行工具进行选择,则在关闭应用程序之前我也看不到数据。

标签: java sqlite jdbc


【解决方案1】:

我注意到您正在使用驱动程序管理器来获取 SQLConnection。 您可能忘记在驱动程序管理器中注册 SQL 驱动程序。 你的代码中应该有这样的东西(你只需要做一次):

  DriverManager.registerDriver(new org.sqlite.JDBC());

编辑:

您的代码中有一个小错误:您正在编写双精度数并读取整数。 为了测试,我创建了一个表“test”,其中包含 double 类型的列“val”。

在我每次运行程序时,都会在输出中写入一个新行:

0
0
0

这是运行程序 3 次后的输出。数据库有 3 行,每次我运行程序时都会添加一个(0 值是因为您正在从双精度值读取整数,随机返回一个介于 0 和 1 之间的值)。

我唯一的解释可能是你的 SQLite 驱动程序中的一个错误。

See my Answer here for a driver update

【讨论】:

  • 如果您使用classForName加载驱动程序,则无需注册驱动程序。否则会有异常。
  • 是的,你是对的。您要么手动注册驱动程序,要么使用 classForName 加载驱动程序类,驱动程序将向驱动程序管理器注册自己。我目前正在尝试运行您的代码,看看是否可以复制问题。
  • 您的代码对我来说运行良好,无法复制问题。请参阅上面对我的答案的编辑。问题可能出在您的 sqlite 驱动程序上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2018-05-16
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多