【问题标题】:DBI::dbSendQuery fails with RJDBC::JDBC for SQL SERVERDBI::dbSendQuery 失败并出现 RJDBC::JDBC for SQL SERVER
【发布时间】:2018-10-31 10:26:48
【问题描述】:

当我使用 odbc 驱动程序运行插入语句时,一切正常。

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 我可以做任何事情。

【问题讨论】:

  • 插入语句不是查询(它不会产生结果集)。使用方法执行非查询。我不了解 RJDBC,因此无法帮助您确定正确的方法:查看其 API 文档。
  • 但是使用 odbc 驱动程序一切正常...
  • 这一切都取决于表面之下发生的事情,并且 JDBC 在执行结果集生成语句和其他语句之间有严格的分离。给定异常 RJDBC 在 JDBC 语句上调用 executeQuery,这对于不产生结果集的语句是不允许的。可能 ODBC 不同。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多