0

嗨我正在使用 R 并想将表视图保存在 ch 中,但它不起作用

我将 dsn 文件保存在名为 dsnfiles 的目录中:

ch <- odbcConnect("S:/dsnfiles/databasex.dsn")
sqlTables(ch)

请问你能帮我吗?此代码不起作用。

谢谢

一种

4

1 回答 1

0

DSN 文件通常存储在系统级别,因此通常不是这样的任意文件。我相信这个odbc包支持 macos 和 linux(不是 windows)上的任意文件,但我没有用RODBC. 话虽如此,解析该文件并获得所需的内容并不难。

对于我的配置,我在本地主机端口 21433 上运行了一个 SQL Server 实例。

我创建了一个"~/StackOverflow/14549856/somedatabase.dsn"以这些内容命名的 DSN 文件:

[ODBC]  
DRIVER=ODBC Driver 17 for SQL Server
TrustServerCertificate=Yes
DATABASE=mydbname
WSID=d2sb2
SERVER=127.0.0.1,21433
UID=myusername
PWD=mypassword

(根据需要替换 uid/pwd)。

我假设由于您只是引用一个没有其他条件的文件,因此您需要的条目([ODBC]在我的示例中)是文件中的唯一条目,所以我将使用它运行。如果您在该文件中有任何格式错误的条目、空行或注释,您可能需要在此处对连接字符串格式进行更多处理。

所以让我们把这个文件转换成一个“连接字符串”(这里是这些字符串的一个很好的参考:https ://www.connectionstrings.com/ )。

connstr <- paste(trimws(readLines("~/StackOverflow/14549856/somedatabase.dsn")[-1]), collapse = ";")
connstr
# [1] "DRIVER=ODBC Driver 17 for SQL Server;TrustServerCertificate=Yes;DATABASE=mydbname;WSID=d2sb2;SERVER=127.0.0.1,21433;UID=myusername;PWD=mypassword"

[-1]摆脱了[ODBC]标题。我们使用所有其他行。)

我们可以在开场白中直接使用它:

rcon <- RODBC::odbcDriverConnect(connection = connstr)
RODBC::sqlQuery(rcon, "select 2 as two")
#   two
# 1   2
RODBC::odbcClose(rcon)

您的 DSN 文件有可能(甚至很可能)比此示例包含更多内容。如果有多个条目(例如,[ODBC][SomeOtherODBC]),那么您将需要更多的工作。下面是一个可能有效的示例(可能无效,取决于评论等)。

新的 DSN 文件内容:

[ODBC]  
DRIVER=ODBC Driver 17 for SQL Server
TrustServerCertificate=Yes
DATABASE=mydbname
WSID=d2sb2
SERVER=127.0.0.1,21433
UID=myusername
PWD=mypassword

[ODBC2]  
DRIVER=ODBC Driver 17 for SQL Server
TrustServerCertificate=Yes
DATABASE=mydbname
WSID=d2sb2
SERVER=127.0.0.1,31433
UID=myusername2
PWD=mypassword2
dsnfile <- readLines("~/StackOverflow/14549856/somedatabase.dsn")
dsnfile <- split(dsnfile, cumsum(grepl("^[[:space:]]*\\[", dsnfile)))
dsnnames <- sapply(dsnfile, function(dsn) trimws(gsub("[][[:space:]]", "", dsn[1])))
dsnfile <- lapply(setNames(dsnfile, dsnnames), function(dsn) paste(trimws(dsn[-1]), collapse = ";"))
str(dsnfile)
# List of 2
#  $ ODBC : chr "DRIVER=ODBC Driver 17 for SQL Server;TrustServerCertificate=Yes;DATABASE=mydbname;WSID=d2sb2;SERVER=127.0.0.1,2"| __truncated__
#  $ ODBC2: chr "DRIVER=ODBC Driver 17 for SQL Server;TrustServerCertificate=Yes;DATABASE=mydbname;WSID=d2sb2;SERVER=127.0.0.1,3"| __truncated__
rcon <- RODBC::odbcDriverConnect(connection = dsnfile[["ODBC"]])
RODBC::sqlQuery(rcon, "select 3 as three")
#   three
# 1     3
RODBC::odbcClose(rcon)
于 2020-10-30T16:24:25.687 回答