3

假设您尝试使用 RSQLite 执行典型的插入或更新循环。我希望以下工作:

library(DBI)
testdb <- dbConnect(RSQLite::SQLite(), "test.sqlite")
dbExecute(testdb, "CREATE TABLE spray_count (spray TEXT, count INTEGER)")
urs <- dbSendStatement(testdb, "UPDATE spray_count SET count = count + :count WHERE spray = :spray")
irs <- dbSendStatement(testdb, "INSERT INTO spray_count VALUES (:spray, :count)")
for (i in 1:nrow(InsectSprays)) {
  print(paste("update", i))
  dbBind(urs, InsectSprays[i,])
  if (!dbGetRowsAffected(urs)) {
    print(paste("insert", i))
    dbBind(irs, InsectSprays[i,])
  }
}

但它没有:

[1] "update 1"
Error in rsqlite_bind_rows(res@ptr, params) : 
  external pointer is not valid
In addition: Warning message:
Closing open result set, pending rows 

基本上,您似乎一次只能有一个准备好的语句,并且创建第二个语句会以某种方式使第一个语句无效。我是否遗漏了什么或者这是 DBI 和/或 RSQLite 的限制?我有 DBI v0.6-1 和 RSQLite v1.1-2。

4

0 回答 0