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();
}
这个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 出现此错误消息的可能原因是什么?