【发布时间】: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