12

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

例如,使用“ODBC Driver 17 for SQL Server”,ODBC 数据源管理器(在 Windows 中)允许使用“登录 ID”和“密码”进行身份验证,但在以编程方式连接时,我们需要分别使用uid=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,它列出了几个其他参数(尽管不是它们可能的值)。这适用于这个驱动程序,虽然由于这个页面没有为驱动程序 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>
4

1 回答 1

3

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

于 2020-06-02T22:46:40.287 回答