我已经像这样安装了rsqlserver(没有错误)

install_github('rsqlserver', 'agstudy',args = '--no-multiarch')


并创建到我的数据库的连接:

> library(rClr)
> library(rsqlserver)

Warning message:
multiple methods tables found for ‘dbCallProc’

> drv <- dbDriver("SqlServer")
> conn <- dbConnect(drv, url = "Server=MyServer;Database=MyDB;Trusted_Connection=True;")
>


现在,当我尝试使用dbGetQuery获取数据时,出现以下错误:

> df <- dbGetQuery(conn, "select top 100 * from public2013.dim_Date")

Error in clrCall(sqlDataHelper, "GetConnectionProperty", conn, prop) :
  Type:    System.MissingMethodException
Message: Method not found: 'System.Object System.Reflection.PropertyInfo.GetValue(System.Object)'.
Method:  System.Object GetConnectionProperty(System.Data.SqlClient.SqlConnection, System.String)
Stack trace:
   at rsqlserver.net.SqlDataHelper.GetConnectionProperty(SqlConnection _conn, String prop)

>


当我尝试使用dbSendQuery获取结果时,也会出现错误。

> res <- dbSendQuery(conn, "select top 100 * from public2013.dim_Date")
> df <- fetch(res, n = -1)

Error in clrCall(sqlDataHelper, "Fetch", stride) :
  Type:    System.InvalidCastException
Message: Object cannot be stored in an array of this type.
Method:  Void InternalSetValue(Void*, System.Object)
Stack trace:
   at System.Array.InternalSetValue(Void* target, Object value)
   at System.Array.SetValue(Object value, Int32 index)
   at rsqlserver.net.SqlDataHelper.Fetch(Int32 capacity) in c:\projects\R\rsqlserver\src\rsqlserver.net\src\SqlDataHelper.cs:line 116


奇怪的是,文件c:\projects\R\rsqlserver\src\rsqlserver.net\src\SqlDataHelper.cs在我的计算机上实际上并不存在。

难道我做错了什么?

最佳答案

我是rsqlserver软件包的创建者。对不起,很抱歉,但是我终于有时间修复此错误。 (实际上这是一个尚未实现的功能)。我在这里演示如何在Sql服务器中读取/写入缺少值的data.frame。

首先,我创建一个缺少值的data.frame。区分数字变量和字符变量之间的区别很重要。

library(rsqlserver)
url = "Server=localhost;Database=TEST_RSQLSERVER;Trusted_Connection=True;"
conn <- dbConnect('SqlServer',url=url)
## create a table with some missing value
dat <- data.frame(txt=c('a',NA,'b',NA),
                  value =c(1L,NA,NA,2))


我的输入看起来像这样:

# txt value
# 1    a     1
# 2 <NA>    NA
# 3    b    NA
# 4 <NA>     2


我使用方便的功能dbWriteTable将dat插入数据库中:
dbWriteTable(conn,name ='T_TABLE_WITH_MISSINGS',
dat,row.names = FALSE,overwrite = TRUE)
然后,我将使用2种方法阅读它:

dbSendQuery

res = dbSendQuery(conn,'SELECT *
                  FROM T_TABLE_WITH_MISSINGS')
fetch(res,n=-1)
dbDisconnect(conn)
   txt value
1    a     1
2 <NA>   NaN
3    b   NaN
4 <NA>     2


dbReadTable:

rsqlserver兼容DBI,并实现了许多便利的功能,至少可以处理SQL。

conn <- dbConnect('SqlServer',url=url)
dbReadTable(conn,name='T_TABLE_WITH_MISSINGS')
dbDisconnect(conn)
   txt value
1    a     1
2 <NA>   NaN
3    b   NaN
4 <NA>     2

08-19 22:45