Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQLite(JDBC)未写入数据_Java_Sqlite_Jdbc - Fatal编程技术网

Java SQLite(JDBC)未写入数据

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

我有一个应用程序,可以将数据读写到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();
}
如果调用
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