SQL Server的RJDBC :: JDBC导致DBI :: dbSendQuery失败

时间:2018-10-31 10:26:48

标签: r sql-server jdbc mssql-jdbc rjdbc

当我使用 odbc 驱动程序运行insert语句时,一切都很好。

drv <- odbc::odbc()
conn <- createConn(drv, trusted_connection = T, dsn="mydsn", uid="myuid", pwd="mypwd")
DBI::dbSendQuery("INSERT INTO \"dbo\".\"testjdbc\" (d) values('4')")

当我使用 jdbc 运行select语句时,一切都很好:

   drv <- RJDBC::JDBC(driverClass = "com.microsoft.sqlserver.jdbc.SQLServerDriver", classPath = "C:\\mssql-jdbc-7.0.0.jre8.jar") 
    conn <- DBI::dbConnect(drv, trusted_connection = T, url = "jdbc:sqlserver://myserver\\\\myinstance:1111;databaseName=mydatabasename", user="myuid", password="mypwd") 
    DBI::dbGetQuery(conn, "Select * from dbo.mytable")

并且 jdbc 的连接有效:

drv <- RJDBC::JDBC(driverClass = "com.microsoft.sqlserver.jdbc.SQLServerDriver", classPath = "C:\\mssql-jdbc-7.0.0.jre8.jar") 
        conn <- DBI::dbConnect(drv, trusted_connection = T, url = "jdbc:sqlserver://myserver\\\\myinstance:1111;databaseName=mydatabasename", user="myuid", password="mypwd") 
    DBI::dbIsValid(conn) # TRUE

但是当我尝试使用 jdbc 驱动程序插入语句(与第一个语句相同)时,如下所示:

drv <- RJDBC::JDBC(driverClass = "com.microsoft.sqlserver.jdbc.SQLServerDriver", classPath = "C:\\mssql-jdbc-7.0.0.jre8.jar") 
conn <- DBI::dbConnect(drv, trusted_connection = T, url = "jdbc:sqlserver://myserver\\\\myinstance:1111;databaseName=mydatabasename", user="myuid", password="mypwd") 
DBI::dbSendQuery(conn, "INSERT INTO \"dbo\".\"testjdbc\" (d) values('4')")

然后我得到错误:

Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ",  : 
  Unable to retrieve JDBC result set for INSERT INTO "dbo"."testjdbc" (d) values('4') (The statement did not return a result set.)

因此 jdbc 选择是可以的,但是使用 odbc 时,插入,更新,删除会出现错误。

1 个答案:

答案 0 :(得分:1)

解决方案是不使用DBI::dbSendQuery而是使用RJDBC::dbSendUpdate运行插入。

谢谢@Mark Rotteveel的回答。多亏了您,我找到了解决方案。