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