嗨我正在使用 R 并想将表视图保存在 ch 中,但它不起作用
我将 dsn 文件保存在名为 dsnfiles 的目录中:
ch <- odbcConnect("S:/dsnfiles/databasex.dsn")
sqlTables(ch)
请问你能帮我吗?此代码不起作用。
谢谢
一种
嗨我正在使用 R 并想将表视图保存在 ch 中,但它不起作用
我将 dsn 文件保存在名为 dsnfiles 的目录中:
ch <- odbcConnect("S:/dsnfiles/databasex.dsn")
sqlTables(ch)
请问你能帮我吗?此代码不起作用。
谢谢
一种
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)