将 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】:

更新

您对RODBCdbConnect 的调用不同。在前者中,您正在访问一个名为"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 &lt;0 rows&gt; (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。举个例子,如果钢筋

POJ 1905 Expanding Rods#二分

用rod获取百度搜索结果的例子

用rod获取百度搜索结果的例子

*.rod是哪个rtk软件的文件