SQLITE JDBC驱动程序预处理语句失败(内部指针0)

时间:2018-01-25 21:13:07

标签: sqlite jdbc

SQLite JDBC驱动程序版本3.21.0(最新版本)。

摘要

为表上的多个插入操作打开预准备语句,但无法在主键冲突中存活。

如果由于主键违规而导致一个“错误”插入失败,则准备好的语句将无法处理后续的“好”插入。调用pstmt.setString()时会引发异常“语句未执行”。

将错误追踪到org.Sqlite.core.CorePreparedStatement,调用在checkOpen()指针== 0中失败。

示例如下。

有谁知道为什么会这样?我看到一个类似的bug report被提出但据说是固定的。

Connection conn = DriverManager.getConnection("jdbc:sqlite:./test.db");
String createtable = "CREATE TABLE dummy(ID text, VAL text, PRIMARY KEY(ID) )";
String psSQL       = "INSERT INTO dummy (ID, VAL) VALUES (?,?)";
String id = "123456789";
String val = "FooBar";
String id2 = "123456789";
String val2 = "FooBar2";
String id3 = "345678901";
String val3 = "FooBar3";

try {
    Statement st= conn.createStatement();
    st.executeUpdate(createtable);
    PreparedStatement pst = conn.prepareStatement(psSQL);

    // 1 insert good entry
    pst.setString(1, id);
    pst.setString(2, val);
    pst.executeUpdate();
    System.out.println("1st insert OK for " + id);

    // 2. try to insert bad duplicate entry with pkey violation
    try {
        pst.setString(1, id);
        pst.setString(2, val);
        pst.executeUpdate();
        System.out.println("2nd insert OK for " + id);
    } catch (SQLException e) {
        System.out.println("2nd insert Failed for " + id);
        e.printStackTrace();
    }

    // 3. try to insert 3rd good value
    try {
        pst.setString(1, id3);      // exception raised here
        pst.setString(2, val3);
        pst.executeUpdate();
        System.out.println("3 insert OK for " + id3);
    } catch (SQLException e) {
        System.out.println("3 insert Failed for " + id3);
        e.printStackTrace();
    }

    pst.close();
    st.executeUpdate(droptable);

} catch (SQLException e) {
    e.printStackTrace();
} 

1 个答案:

答案 0 :(得分:0)

此错误已在sqlite-jdbc版本 3.25.2 中得到修复,请参见https://github.com/xerial/sqlite-jdbc#news