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)
嗨,我正在使用 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)