我继续阅读DBI/ODBC
比RODBC
快,所以我尝试如下:
require(DBI);require(odbc)
con <- DBI::dbConnect(odbc::odbc(), dsn = 'SQLSERVER1', database = 'AcumaticaDB')
我可以成功连接到DSN,但可以执行以下查询:
rs <- dbGetQuery(con, "SELECT * FROM inventoryitem")
dbFetch(rs)
给我以下错误:
result_fetch(res @ ptr,n,...)中的错误:
nanodbc / nanodbc.cpp:3110:07009:[Microsoft] [用于SQL Server的ODBC驱动程序13]无效的描述符索引
我究竟做错了什么 ?
请没有
RODBC
解决方案。谢谢!
最佳答案
我也为此问题苦苦挣扎了几个月。但是,我遇到了一个可能对您也有帮助的解决方案。
简而言之,当某些文本列没有出现在整数/数字列之后时,就会出现此问题。当查询中的列未正确对齐时,将引发错误invalid index
,并且您的连接可能会冻结。问题是,我怎么知道在查询末尾要输入什么?
为了确定这一点,通常可以使用class()
或typeof()
检查一列。要检查数据库中的此类信息,可以使用以下查询:
dbColumnInfo(dbSendQuery(con, "SELECT * from schema.table")) # You may not require the schema part...
这将为感兴趣的数据集中的每一列返回一个带有类型字段的表。然后,您可以将此表用作索引以对
select()
语句进行排序。我的特别困难是表中的type
字段是所有数字!但是,我注意到,每条带有负数的列都放置在select语句的末尾,可以解决查询问题,并且可以很好地拉动整个表。例如,我的完整解决方案:# Create my index of column types (ref to the current order)
index <- dbColumnInfo(dbSendQuery(con, "SELECT * from schema.table"))
index$type <- as.integer(index$type) # B/c they are + and - numbers!
# Create the ref to the table
mySQLTbl <- tbl(con, in_schema("schema", "tablename"))
# Use the select statement to put all the + numbered columns first!
mySQLTbl %>%
select(c(which(index$type>=0),
which(index$type<0)))
至于发生这种情况的原因,我不确定,并且我没有数据访问权限可以在用例中进行更深入的研究
关于r - R DBI ODBC错误:nanodbc/nanodbc.cpp:3110:07009:[Microsoft] [用于SQL Server的ODBC驱动程序13]无效的描述符索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45001152/