我正在处理psqlODBC的XA / MSDTC事务处理的一些问题,我发现自己需要从任何用户提供的dsn以编程方式获取服务器连接详细信息(主机名,端口等)没有通过驱动程序管理器调用psqlODBC来执行此操作。
刚解析的键/值字符串对会做;问题是解析用户/系统/文件DSN以获取基础连接信息。
我试图解决的基本问题是在64位系统上使用MSDTC的32位应用程序将提供适用于32位PostgreSQL驱动程序的DSN。 64位PostgreSQL驱动程序具有不同的名称 - PostgresSQL ANSI
vs PostgreSQL ANSI(x64)
,类似于Unicode驱动程序。因此,适用于32位应用程序的DSN不适用于64位应用程序......例如msdtc.exe
。所以我需要一种方法来获取所使用的32位应用程序的连接参数,并将它们提供给64位ODBC驱动程序(或直接转到libpq
)。
对于无DSN连接字符串,例如:
DRIVER={{PostgreSQL ANSI}};SERVER=127.0.0.1;PORT=5432;DATABASE=SOMEDB;UID=Administrator;PWD=;CA=disable"
我可以解析它以获取相关信息,但这对于文件,系统或用户DSN不起作用,其中MSDTC使用的XA事务协调器只能获取原始用户应用程序传递给的任何内容。 ODBC层 - 如:
DSN=SomeUserOrSystemDSNName
或
FILEDSN=C:\SomeFileDSN.dsn
并且包含在DSN中的是DRIVER={{{PostgreSQL ANSI}}
。
我已经查看了ODBC API文档,但我看不到任何似乎暴露加载任何DSN字符串的方法,解析文件/系统/用户DSN并获取参数哈希/地图。 OTOH,那里有很多的文档,而且有些部分和功能名称并不是我所谓的可预测的。
所以 - 请告诉我,我错过了一些明显的东西,而且还有一种方法可以:
GetDSNProperty("FILEDSN=C:\SomeFileDSN.dsn", "SERVER");
..而不是编写hacky代码来手动查找每个DSN类型。