如何查找ODBC驱动程序特定的参数

13

有没有一种编程的方法可以发现ODBC连接的命名参数?例如,使用“ODBC Driver 17 for SQL Server”,ODBC数据源管理员(在Windows中)允许使用“登录ID”和“密码”进行身份验证,但是当以编程方式连接时,我们需要分别使用uid=pwd=。这两个配置点在配置文档中明确列出(例如:https://db.rstudio.com/databases/microsoft-sql-server/),但是驱动程序支持的其他几个配置选项未经记录或未记录完全。

(对于SQL Server,还有更多的文档,包括https://learn.microsoft.com/en-us/sql/connect/odbc/windows/driver-aware-connection-pooling-in-the-odbc-driver-for-sql-server?view=sql-server-ver15,列出了几个其他参数(尽管没有它们的可能值)。这适用于驱动程序,但由于此页面尚未更新为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>

1
只是为了明确一下 - 您正在寻找一种以编程方式查询ODBC驱动程序并检索API功能的方法?正确吗?您是通过ODBC驱动程序连接到REST API吗? - Technophobe01
我不知道是否有ODBC 驱动程序的API(这种东西存在吗?),但很可能是ODBC协议本身。一个问题是,驱动程序都是由不同的组织编写的,所以我认为仅仅查看驱动程序DLL本身是不够强大的。我想知道是否有一种编程方式(在ODBC范围内?)可以发现参数的存在和名称,即使仅仅是这样。 - r2evans
ODBC驱动程序支持连接字符串,以记录所需的参数。https://www.connectionstrings.com/microsoft-access-odbc-driver/ 您还可以发布自己的连接字符串或查询它。我想这就是您要寻找的内容。如果您正在使用ODBC驱动程序连接到REST API,则有解决方案可以查询并针对REST API生成正确的查询。https://www.progress.com/tutorials/odbc/query-any-rest-api-using-odbc-in-5-mins---getting-started-(part-1)【我没有关联此网站,只是提供参考。希望以上内容能有所帮助。】 - Technophobe01
我并没有连接到REST API,也不打算这样做,我是使用ODBC驱动程序来连接DBMS的。如果我们把“REST”去掉,我的问题是是否有一种方法可以通过编程方式查询驱动程序或者获取其属性。而不是通过文档。虽然连接字符串网站确实有价值,但它是不完整的(与Microsoft的原始文档相比)。再次强调,我想了解的是编程发现方面的内容。谢谢! - r2evans
@JoshuaMire,感谢您对RODBCodbc的评论(已删除的答案)。我认为这并不重要:它的文档甚至说:“支持哪些字段是特定于驱动程序的(而且很难找到文档)”,这表明作者不知道编程发现(或者至少没有深入研究)。我担心这个问题主要只是确认ODBC作为协议不支持这个概念。再次感谢。 - r2evans
显示剩余2条评论
1个回答

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

这是一个不错的发现...更重要的是,我认为odbc与其构建在其上的底层库nanodbc不同。有点遗憾...但是这是个好发现。 - r2evans
你有没有兴趣编写一个命令行辅助程序呢?因为odbcnanodbc都不支持它。 :-) - r2evans
1
谢谢Alexander!我并不惊讶没有找到/呈现可以从R中选择使用的现有工具,但我惊讶ODBC标准内置了这种功能。(我感到惊讶,因为ODBC存在一些问题。) - r2evans
2
由此,我向 nanodbc 提交了一个功能请求,以支持这个协议函数,看起来它已经得到了良好的接受。我不知道实现时间表,但是在开发人员中引起了兴趣是很有前途的。 - r2evans
2
很高兴看到我的回答有所帮助。希望nanodbc能够实现这个有用的功能。 - Alexander Ushakov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接