R 中的 odbcConnect - 如何提取 dsn 文件信息?

odbcConnect in R - how to extract dsn file information?

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

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

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

你能帮帮我吗?此代码无效。

谢谢

一个

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

对于我的配置,我在本地主机上有一个 SQL 服务器实例 运行ning,端口 21433。

我创建了一个名为 "~/Whosebug/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] 在我的例子中)是文件中的唯一条目,所以我' ll 运行 与那个。如果您在该文件中有任何格式错误的条目、空行或注释,您可能需要在此处对连接字符串格式进行更多操作。

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

connstr <- paste(trimws(readLines("~/Whosebug/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] header。我们使用所有其他行。)

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

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("~/Whosebug/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)