【问题标题】:how to find ODBC driver-specific arguments如何查找特定于 ODBC 驱动程序的参数
【发布时间】:2020-09-01 14:59:12
【问题描述】:

有没有办法以编程方式发现 ODBC 连接的命名参数?

例如,使用“ODBC Driver 17 for SQL Server”,ODBC 数据源管理器(在 Windows 中)允许使用“登录 ID”和“密码”进行身份验证,但在以编程方式连接时,我们需要使用 @分别为 987654326@ 和 pwd=。这两个配置点在配置文档中明确列出(例如,https://db.rstudio.com/databases/microsoft-sql-server/),但驱动程序支持的其他几个配置选项较少或未记录。

(对于 SQL Server,有更多文档,包括 https://docs.microsoft.com/en-us/sql/connect/odbc/windows/driver-aware-connection-pooling-in-the-odbc-driver-for-sql-server?view=sql-server-ver15,列出了其他几个参数(尽管不是它们可能的值)。这适用于 this 驱动程序,但因为此页面没有已针对 Driver 17 进行了更新,我们必须假设所有选项均未更改。)

可以通过编程方式了解可用的驱动程序以及可用的预定义数据源:

odbc::odbcListDrivers()
#                             name        attribute value
# ...truncated...
# 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::odbcListDataSources()
#                 name                   description
# 1             somedb ODBC Driver 17 for SQL Server
# 2 SQLite3 Datasource           SQLite3 ODBC Driver

但没有发现连接参数。也许类似于这个不存在的功能:

discover_odbc_arguments("ODBC Driver 17 for SQL Server")
# [1] "Address"                "AnsiNPW"                "App"                   
# [4] "Database"               "Encrypt"                "PWD"                   
# [7] "Trusted_Connection"     "TrustServerCertificate" "UID"                   

(我在这里使用 SQL Server 作为示例,但我对更通用的方法感兴趣。而且由于我正在寻找编程机制,我宁愿避免建议阅读每个驱动程序的文档。)

(我不反对非 R 方法。)


一些无效的非 R 尝试。使用已知参数模式的 mssql odbc 驱动程序库作为示例。

$ strings /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.5.so.2.1  \
  | egrep -i 'Trusted.Conn|AnsiDPW|TrustServer'
### <no output>
$ grep -rli 'Trusted.Conn|AnsiDPW|TrustServer' /opt/microsoft/msodbcsql17/
### <no output>

【问题讨论】:

  • 这里要明确一点 - 您正在寻找一种以编程方式查询 ODBC 驱动程序并检索 API 功能的方法?正确的?您是否通过 ODBC 驱动程序连接到 REST API?
  • 我不知道 ODBC 驱动程序 的 API(有这种东西吗?),但很可能是 ODBC 协议本身。一个问题是驱动程序都是由不同的组织编写的,所以我认为查看驱动程序 DLL 本身是很薄弱的。我在问是否有一种编程方式(在 ODBC 范围内?)来发现参数的存在和名称,即使仅此而已。
  • ODBC 驱动程序支持记录所需参数的连接字符串。 connectionstrings.com/microsoft-access-odbc-driver 您可能还想发布自己的连接字符串或查询它。我认为这就是你要找的。如果您使用 ODBC 驱动程序连接到 REST API,则有一些解决方案可以针对 REST API 查询并生成正确的查询。 progress.com/tutorials/odbc/…【本人不隶属,仅供参考。希望以上内容有所帮助。
  • 我没有连接到 REST API,也不想这样做,我正在使用 ODBC 驱动程序连接到 DBMS。如果我们去掉“REST”,我要问的是是否有一种方法可以以编程方式查询驱动程序或抓取或确定其属性。不是通过文档。虽然该连接字符串网站确实有价值,但它并不完整(与 microsoft 的原始文档相比)。不过,我再次询问有关程序化发现的问题。谢谢!
  • @JoshuaMire,感谢您对RODBCodbc 的评论(已删除答案)。我认为这并不重要:它的docs 甚至说“支持的字段是特定于驱动程序的(并且可能很难找到文档)”,这表明作者不知道程序化发现(或者至少没有深入研究它们)。我担心这个问题主要是确认 ODBC 作为协议不支持这个概念。再次感谢。

标签: r odbc dbi nanodbc


【解决方案1】:

您需要以某种方式调用SQLBrowseConnect 函数来获取特定ODBC 驱动程序或DSN 的连接字符串的所有可用参数。不幸的是,正如我所见,这个调用没有在 R ODBC 包中实现。有关详细信息,请参阅链接中的文档和示例代码。

【讨论】:

  • 这是一个很好的发现......更重要的是我认为odbc 是它不在nanodbc 中,odbc 是在其上构建的底层库。太糟糕了......但很好的发现。
  • 有没有机会编写一个命令行帮助程序,因为odbcnanodbc 都不支持它? :-)
  • 谢谢亚历山大!对于没有找到/提供现有工具(可以选择从 R 中使用)我并不感到惊讶,但我am惊讶于 ODBC 标准中内置了此功能。 (我很惊讶 b/c 关于 ODBC 的一些问题。)
  • 由此,我向nanodbc提交了一个feature-request,以支持该协议功能,似乎收到了好评。我不知道实施时间表,但让开发人员感兴趣是有希望的。
  • 很高兴看到我的回答很有帮助。让我们希望nanodbc 实现这个有用的功能。
猜你喜欢
  • 2016-03-09
  • 2023-03-27
  • 2017-05-18
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 2014-07-23
  • 2016-01-20
  • 1970-01-01
相关资源
最近更新 更多