Sql server 使用rsqlserver包将数据加载到R中

Sql server 使用rsqlserver包将数据加载到R中,sql-server,r,rsqlserver,Sql Server,R,Rsqlserver,我刚刚像这样安装了rsqlserver(没有错误) 并创建了与我的数据库的连接: > library(rClr) > library(rsqlserver) Warning message: multiple methods tables found for ‘dbCallProc’ > drv <- dbDriver("SqlServer") > conn <- dbConnect(drv, url = "Server=MyServer;Databas

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

并创建了与我的数据库的连接:

> 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;")
> 
当我尝试使用
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
>res-df(编辑:我在你的帖子中遗漏了一些东西(调用获取)。我现在也可以重现这个问题。)

简而言之:您的数据库中有空值吗?这可能是原因

长话短说,完整复制:

我已经使用了一个样本数据库,可以按照

编辑: 我可以复制您的问题:

library(rClr)
library(rsqlserver)
drv <- dbDriver("SqlServer")
conn <- dbConnect(drv, url = "Server=Localhost\\somename;Database=Fabrics;Trusted_Connection=True;")
res <- dbSendQuery(conn, "SELECT TOP 100 * FROM [Fabrics].[dbo].[Client]")
str(res)
## Formal class 'SqlServerResult' [package "rsqlserver"] with 1 slots
  ..@ Id:<externalptr> 
> 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
请注意,我无法复制关于MissingMethodException的非常奇怪的一个

df <- dbGetQuery(conn, "SELECT TOP 100 * FROM [Fabrics].[dbo].[Client]")
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
可变表给了我:

i   11  int
_cnames[i]  "Street2"   string
_reader.GetValue(i) {}  object {System.DBNull}
_reader.GetValue(i-1)   "806 West Sir Francis Drake St" object {string}
_reader.GetValue(i+1)   "Spokane"   object {string}
Street2的条目实际上是空的:

ClientId    FirstName   MiddleName  LastName    Gender  DateOfBirth CreditRating    XCode   OccupationId    TelephoneNumber Street1 Street2 City    ZipCode Longitude   Latitude    Notes
1   Nicholas    Pat Kane    M   1975-10-07 00:00:00.000 3   ZU8 5ML 4   (279) 459 - 2707    2870 North Cherry Blvd. NULL    Carlsbad    64906   32.7608137325835    117.112738329071    
有关信息,sessionInfo()输出包括:

R version 3.0.2 (2013-09-25)
Platform: x86_64-w64-mingw32/x64 (64-bit)
other attached packages:
[1] rsqlserver_1.0 rClr_0.5-2    
loaded via a namespace (and not attached):
[1] DBI_0.2-7   tools_3.0.2

希望这有帮助。

我是
rsqlserver
软件包的创建者。很抱歉迟到了,但我终于有时间修复这个错误了。(实际上,这是一个尚未实现的特性)。我在这里演示如何在Sql server中读取/写入缺少值的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))
DBReadable: 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

conn对于未来读者的信息,您可以在Thank JM上遵循此问题的解决方案-您是对的,它似乎还没有正确处理空值。我还注意到负整数作为正整数返回,但大小不同。@j-m+1!谢谢你的反馈。我还没有处理空值,原因很简单,rClr包不管理可空值。但是我有一个解决这个问题的办法,只要我有空闲时间,我就会去做。@TommyO'Dell我不知道这个关于负整数的问题。欢迎您在GITHUB添加此问题。这太棒了。谢谢你的辛勤工作:)@TommyO'Dell谢谢。仅供参考,我现在正在致力于将rsqlserver与dplyr集成。太棒了!期待使用它。您好@agstudy您在集成rsqlserver和dplyr方面有什么进展吗?@hs3180您在rsqlserver方面面临哪些缺陷?他们是不是在欺骗你,你可以在你的包中添加一个测试部分,或者给rsqlserver添加一个问题,我很乐意帮助你。
ClientId    FirstName   MiddleName  LastName    Gender  DateOfBirth CreditRating    XCode   OccupationId    TelephoneNumber Street1 Street2 City    ZipCode Longitude   Latitude    Notes
1   Nicholas    Pat Kane    M   1975-10-07 00:00:00.000 3   ZU8 5ML 4   (279) 459 - 2707    2870 North Cherry Blvd. NULL    Carlsbad    64906   32.7608137325835    117.112738329071    
R version 3.0.2 (2013-09-25)
Platform: x86_64-w64-mingw32/x64 (64-bit)
other attached packages:
[1] rsqlserver_1.0 rClr_0.5-2    
loaded via a namespace (and not attached):
[1] DBI_0.2-7   tools_3.0.2
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
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
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