将 odbc::dbconnect 转换为 rodbc::odbcDriverConnect
Posted
技术标签:
【中文标题】将 odbc::dbconnect 转换为 rodbc::odbcDriverConnect【英文标题】:translate odbc::dbconnect to rodbc::odbcDriverConnect 【发布时间】:2020-10-01 15:42:52 【问题描述】:我正在尝试连接到 SQL 数据库。它通过 RODBC 包工作:
ch = odbcDriverConnect(paste0("DSN=mydns.net;database=MasterData;UID=user;PWD=pass"))
ch
RODBC Connection 1
Details:
case=nochange
DSN=mydns.net
database=MasterData
UID=user
PWD=******
如何使用 odbc 包建立连接?以下不起作用!
con = dbConnect(odbc(),
Driver = "MSODBC",
Server = "mydns.net",
Database = "MasterData",
UID = "user",
PWD = "pass",
encoding = "windows-1252",
Port = 1433)
Error: nanodbc/nanodbc.cpp:983: 00000: [unixODBC][Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Brugeren 'user' kunne ikke logge p�. [unixODBC][Microsoft][ODBC Driver 13 for SQL Server]Invalid connection string attribute.
还有:
odbc::odbcListDrivers()
name attribute value
1 PostgreSQL Description ODBC for PostgreSQL
2 PostgreSQL Driver /usr/lib/psqlodbcw.so
3 PostgreSQL Setup /usr/lib/libodbcpsqlS.so
4 PostgreSQL Driver64 /usr/lib64/psqlodbcw.so
5 PostgreSQL Setup64 /usr/lib64/libodbcpsqlS.so
6 PostgreSQL FileUsage 1
7 mysql Description ODBC for MySQL
8 MySQL Driver /usr/lib/libmyodbc5.so
9 MySQL Setup /usr/lib/libodbcmyS.so
10 MySQL Driver64 /usr/lib64/libmyodbc5.so
11 MySQL Setup64 /usr/lib64/libodbcmyS.so
12 MySQL FileUsage 1
13 FreeTDS Description FreeTDS for MSSQL
14 FreeTDS Driver /usr/lib64/libtdsodbc.so
15 FreeTDS Setup /usr/lib64/libtdsS.so
16 FreeTDS Driver64 /usr/lib64/libtdsodbc.so
17 FreeTDS Setup64 /usr/lib64/libtdsS.so
18 FreeTDS FileUsage 1
19 FreeTDS UsageCount 1
20 MSODBC Description Microsoft ODBC Driver 13 for SQL Server
21 MSODBC Driver /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.1
22 MSODBC UsageCount 1
我也尝试过相反的过程。对于另一个数据库,我有一个 ODBC
连接,它工作正常:
con <- dbConnect(odbc(),
Driver = "MSODBC",
Server = "D.ad009.win.org",
Database = "LCA",
UID = "LCA-User",
PWD = "xxxx",
encoding = "windows-1252",
Port = 1433)
如果我使用RODBC
包的概念并创建类似ch
的东西:
ch = odbcDriverConnect(paste0("Driver=MSODBC;DSN=D.ad009.win.org;database=LCA;UID=LCA-User;PWD=xxxx"))
我也收到如下错误:
Warning messages:
1: In odbcDriverConnect(paste0("Driver=MSODBC;DSN=D.ad009.win.org;database=LCA;UID=LCA-User;PWD=xxxx")) :
[RODBC] ERROR: state 08001, code 0, message [unixODBC][Microsoft][ODBC Driver 13 for SQL Server]Neither DSN nor SERVER keyword supplied
2: In odbcDriverConnect(paste0("Driver=MSODBC;DSN=D.ad009.win.org;database=LCA;UID=LCA-User;PWD=xxxx")) :
ODBC connection failed
所以当我从 ODBC
更改为 RODBC
时,我需要考虑一些事情,反之亦然。
【问题讨论】:
错误Brugeren 'user' kunne ikke logge
表明您连接正常,但不允许使用您的用户名/密码。您是否联系过您的 DBA 进行权限验证? (为了这个问题,我假设您将真实用户名更改为 'user'
。)
是的。我已经检查了我的用户/通行证。在那个错误消息中,我只是用“用户”替换了真实的用户名。使用相同的身份验证,我可以通过 RODBC 进行连接,但不能使用 ODBC 包!
进展如何?暂时没有更新。
@r2evans,没有进展!刚放弃!问题也与其他方式有关:这意味着我有一个到另一个数据库的 ODBC 连接,当我将它更改为 RODBC 时,我得到了错误。我也将那个问题添加到了问题中。
【参考方案1】:
更新:
您对RODBC
和dbConnect
的调用不同。在前者中,您正在访问一个名为"mydsn.net"
的“数据源名称”(DSN),而在后者中,您正在访问一个名为"mydsn.net"
的服务器主机。找到定义 [mydsn.net]
的 odbc.ini
(在 ~ 或 /etc 中),看看那里使用了哪些其他参数,这些参数可能会为其他参数提供线索。
我认为您需要更新您的Driver=
,错误消息很好地暗示了它可能是什么:"ODBC Driver 13 for SQL Server"
。
不过,最终还是要查找 odbc
软件包在您的系统上找到的可用内容。在我的身上,这是我发现的:
subset(odbc::odbcListDrivers(), grepl("SQL Server", name))
# name attribute value
# 1 SQL Server APILevel 2
# 2 SQL Server ConnectFunctions YYY
# 3 SQL Server CPTimeout 60
# 4 SQL Server DriverODBCVer 03.50
# 5 SQL Server FileUsage 0
# 6 SQL Server SQLLevel 1
# 7 SQL Server UsageCount 1
# 33 ODBC Driver 17 for SQL Server UsageCount 1
# 34 ODBC Driver 17 for SQL Server APILevel 2
# 35 ODBC Driver 17 for SQL Server ConnectFunctions YYY
# 36 ODBC Driver 17 for SQL Server CPTimeout 60
# 37 ODBC Driver 17 for SQL Server DriverODBCVer 03.80
# 38 ODBC Driver 17 for SQL Server FileUsage 0
# 39 ODBC Driver 17 for SQL Server SQLLevel 1
(自己使用odbc::odbcListDrivers()
。我正在过滤它,因为我的系统上还有很多东西会弄乱页面。)
对我来说,我应该使用Driver="ODBC Driver 17 for SQL Server"
。 (我可以使用"SQL Server"
,但是那个驱动程序……坏了。)看起来你的系统默认使用驱动程序的版本 13;如果您想坚持使用它或使用可用的更新版本,请交给您。
另外,需要将端口添加到server
组件中,如server="host,port"
。它默认为 1433,因此您可以完全省略该参数,除非您使用的是非标准端口。
这意味着你应该能够做类似的事情
con = dbConnect(odbc(),
Driver = "ODBC Driver 13 for SQL Server",
Server = "mydns.net",
Database = "MasterData",
UID = "user",
PWD = "pass",
encoding = "windows-1252")
【讨论】:
我已经尝试过你的建议:Error: nanodbc/nanodbc.cpp:983: 00000: [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 13 for SQL Server' : file not found
也运行subset(odbc::odbcListDrivers(), grepl("SQL Server", name))
没有任何回报! [1] name attribute value <0 rows> (or 0-length row.names)
删除subset
并运行odbc::odbcListDrivers()
。我过滤了它,因为我的系统还有其他几个可用的驱动程序分散了注意力。
但是,当连接到我的 SQL Server 实例时,我使用上面的代码并更改为我的值(没有添加或删除任何参数)并且它连接得很好。错误 file not found
高度怀疑正在发生其他事情(不是 R)。
你试过Driver="FreeTDS"
或Driver="FreeTDS for MSSQL"
或Driver="Microsoft ODBC Driver 13 for SQL Server"
吗?【参考方案2】:
您可以尝试直接使用 SQL Server 驱动程序:
con <- dbConnect(odbc(),
Driver = "SQL Server",
Server = "mydns.net",
Database = "MasterData",
uid = "user",
pwd = "pass",
encoding = "windows-1252",
Port = 1433)
【讨论】:
Error: nanodbc/nanodbc.cpp:983: 00000: [unixODBC][Driver Manager]Can't open lib 'SQL Server' : file not found
我明白了,你需要为 linux 安装 SQL Server 客户端
但是 RODBC 是如何建立连接的呢?!
或许可以查看this link 以找到已安装的驱动程序/连接的名称。
好的,抱歉,没注意。所以没有安装本机 SQL Server 客户端。以上是关于将 odbc::dbconnect 转换为 rodbc::odbcDriverConnect的主要内容,如果未能解决你的问题,请参考以下文章
2021-07-18:最高的广告牌。你正在安装一个广告牌,并希望它高度最大。这块广告牌将有两个钢制支架,两边各一个。每个钢支架的高度必须相等。你有一堆可以焊接在一起的钢筋 rods。举个例子,如果钢筋