当前位置: 首页 > 知识库问答 >
问题:

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

糜俊彦
2023-03-14

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

摘要

为对表执行多个insert操作而打开准备好的语句,但该语句无法在主键冲突中存活。

如果一个“坏的”插入由于主键冲突而失败,那么准备好的语句将无法处理后续的“好的”插入。调用PSTMT.SetString()时引发异常“语句未执行”。

将错误跟踪到org.sqlite.core.CorePreparedStatement,调用在checkOpen()pointer==0中失败。

示例如下。

有人知道为什么会这样吗?我看到一个类似的错误报告被提出,但应该是修复。

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个答案

赵英资
2023-03-14

这个bug已经在sqlite-jdbc版本3.25.2中修复,请参阅https://github.com/xerial/sqlite-jdbc#news。

 类似资料:
  • 我正试图为我的mysqli连接编写一个非常小的抽象层,但遇到了一个问题。由于我维护的是较旧的代码,我需要从我的查询中获得一个关联数组,因为这是代码设置的方式,因此一旦这样做了,我的工作就少了...这个函数可以处理各种查询(不仅仅是选择)... 我写的函数是这样的: 添加的问题 仅仅为了保留关联数组返回,这样的开销是不是太大了?是否应该改用?

  • 使用Chris Brand的答案-它把我带到绑定参数并停在那里... 用阿卜杜拉的回答:

  • 我有一个Spring应用程序,在IDE和本地mariadb中运行良好,在POM中使用mariadb 2.7.4,如下所示,但我在Ubuntu上运行它时出现了第二个错误。我已经删除了mysql连接器,但仍然存在问题。为什么会出现差异和问题? 原因:组织。springframework。豆。BeanInstationException:未能实例化[com.zaxxer.hikari.HikariDat

  • 问题内容: 关于golang的sql驱动程序,以下两个语句之间有什么区别? 和 看来他们是一样的吗?有什么细微的区别吗? 更新 : 我们不需要执行许多或之后,只有一个或每个之后执行。当使用or时,我们将参数传递给方法,而不是使用原始SQL字符串(出于安全考虑)。 我发现了一个参考链接:http : //go-database- sql.org/prepared.html 似乎两种方式都使用了 预处

  • 我正在尝试学习使用准备好的语句以避免SQL注入等的正确方法。 当我执行这个脚本时,我从我的脚本中得到一条消息,说插入了0行,我希望这条消息说插入了1行,当然更新了表。我不是完全确定我准备好的陈述,因为我做了一些研究,我的意思是,每一个例子都不一样。 当我更新我的表时,我需要声明所有的字段还是只更新一个字段就可以了?? 任何信息都会很有帮助。 index.php 类/class.scripts.in

  • 我们有一个db2 database V9.7FP1 出现此错误消息的可能原因是什么?