用 C# 编写的 ODBC (DSN/驱动程序) 管理器 DLL (版本 - I)






4.79/5 (17投票s)
ODBC 管理器类,用于检索系统和用户 DSN 以及驱动程序列表。
目标读者
正在使用 ODBC 连接到任何数据库,并希望用 C#/.NET 编程的程序员。
引言
通过本文,我想向读者介绍一个 ODBCManager
类,该类允许用户获取系统中安装的 ODBC 驱动程序列表。此外,此类还为用户提供所有系统 DSN 和用户 DSN。
难词
(有经验的读者可以忽略/略读本节。我将大部分以下内容摘自互联网)
关于 DSN
DSN 是 Data Source Name 的缩写。它是一种简单而标准的方法,用于使用 ODBC 驱动程序描述如何连接到数据源 (数据库)。更重要的是,使用 DSN 意味着我们可以通过更新 DSN 来更改数据的位置,而无需更新我们的应用程序。但我们必须记住,DSN 仅描述 ODBC 连接,而不描述 OLEDB 连接。
DSN 有三种类型:系统、用户和文件。
系统 DSN 和用户 DSN 之间的唯一区别在于它们在系统上的可访问性。然而,文件 DSN 实际上并不是一个数据源。它是一个包含连接到 ODBC 驱动程序所需的所有连接参数的文件。
系统 DSN 和用户 DSN 基于 Windows 注册表,而文件 DSN 存储在文件系统中。我们通常通过 ODBC 数据源管理器创建和管理 DSN,该管理器位于 NT/9x 计算机的控制面板中,或位于 Win2K 计算机的管理工具中。然而,编辑 DSN 并没有什么神秘之处。我们可以使用 regedit 查看/修改用户或系统 DSN,而 Notepad 对于文件 DSN 来说工作得很好。
大多数关于 DSN 的信息都存储在注册表中。
HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI
包含计算机上所有已安装 ODBC 驱动程序的列表。HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI
包含所有作为单独子项存储的系统 DSN。
ODBC.INI
还有两个其他子项:ODBC Data Sources
包含所有系统 DSN 的列表,以及 ODBC FileDSN
,它包含文件 DSN 存储的文件夹名称 (C:\Program Files\Common Files\ODBC\Data Sources 是默认值)。用户 DSN 存储在 HKEY_CURRENT_USER\Software\ODBC\ODBC.INI
中。
选择使用哪种类型的 DSN 取决于我们的应用程序的工作方式。几乎所有情况下,系统 DSN 都有效。如果我们使用用户 DSN,那么我们将不得不做一些额外的工作来确保在首次登录的新用户首次登录到该计算机时创建 DSN。
关于 ODBC 驱动程序
ODBC 驱动程序充当应用程序和数据库之间的“翻译器”。有许多数据库的驱动程序可用,例如 Oracle、MS Access、SQL Server、Foxbase 等。这些驱动程序的主要用途是,在没有数据库供应商提供的客户端程序的情况下,这些驱动程序允许我们与数据库进行交互。例如,假设我们有一个 Oracle 数据库,其中包含一些表。现在,如果我们的计算机上安装了 Oracle ODBC 驱动程序,那么我们就不需要 Oracle S/W (昂贵) 来与该数据库通信。但我们必须编写自己的例程,使用 C++/C# 或任何我们想要使用的语言 (支持 ODBC 驱动程序 API) 提供的 ODBC 来与数据库通信。
此类如何工作
ODBCManager
类定义在 ODBCMngr
命名空间中。此类存在于 DLL ODBCMngr.DLL 中。此类具有所有静态方法。因此,无需创建实例 (实际上用户也无法创建,因为该类遵循单例模式)。除了 ODBCManager
之外,DLL 还有另外两个类:ODBCDriver
和 ODBCDSN
。
此 ODBCManager
类具有以下静态方法。
public static ODBCDriver[] GetODBCDrivers();
public static ODBCDriver GetODBCDriver(string driverName);
public static ODBCDSN[] GetSystemDSNList();
public static ODBCDSN GetSystemDSN(string dsnName);
public static ODBCDSN[] GetUserDSNList();
public static ODBCDSN GetUserDSN(string dsnName);
public static RegistryKey OpenComplexSubKey(RegistryKey baseKey, string complexKeyStr, bool writable);
除了方法 7,上述方法的签名都是不言自明的。
我将方法 7 添加到类中,因为我在 .NET 框架的 Registry
类中找不到任何方法可以为嵌套键提供 RegistryKey
。例如,要获取注册表中 HKEY_LOCAL_MACHINE
根文件夹中的 Software
子文件夹,可以使用以下方法调用。
RegistryKey fianlKey = (Registry.LocalMachine).OpenSubKey("Software");
现在,如果我们想要注册表中 HKEY_LOCAL_MACHINE
根文件夹中 Software\ODBC\
的键,可以使用以下方法调用。
RegistryKey fianlKey = (Registry.LocalMachine).OpenSubKey("Software");
fianlKey = fianlKey.OpenSubKey("ODBC");
现在我的方法 (7) 可以消除多次调用 OpenSubKey()
方法,如上所示。所以使用 (7)
RegistryKey finalKey =
ODBCManager.OpenComplexSubKey(Registry.LocalMachine,
"Software\ODBC\", false);
注意:最后一个参数是一个布尔标志,它告诉 OpenComplexSubKey
方法在子文件夹不存在时创建它。
程序注释
由于这是一个包含可调用方法的 DLL,所以我并不认为编写客户端程序有什么用。所以我没有编写任何使用上述 DLL 的程序。
请注意,这是 DLL 的第一个版本。我将在将来尝试向此 DLL 添加更多相关内容。如果我这样做,我将再次更新。
希望我解释了所有需要解释的事情。如果你们中的任何人觉得我做得非常错误或不清楚,请告诉我。我将尝试纠正和/或回复。