我刚刚像这样安装了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
实际上并不存在于我的计算机上。
我做错了什么吗?
最佳答案
我是 agstudy 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
将数据插入到我的数据库中:
dbWriteTable(conn,name='T_TABLE_WITH_MISSINGS',
dat,row.names=FALSE,覆盖=TRUE)
然后我会用两种方法来阅读它:
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
关于sql-server - 使用 rsqlserver 包将数据加载到 R 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21420399/