MFC-ODBC API动态连接配置数据库

发布时间 2023-11-23 11:56:17作者: Lee君

一、ODBC管理器介绍

在Window中,ODBC数据远管理器有6个标签:用户DSN、系统DSN、文件DSN、驱动程序、跟踪、连接池,通常情况下,使用用户DSN或者系统DSN,这里主要了解用户DSN和系统DSN即可。

  1. 用户DSN:ODBC用户数据源存储了如何与指定的数据库提供者连接的信息,只有当前用户可见。
  2. 系统DSN:ODBC系统数据源存储了如何与指定数据库提供者连接的信息,系统数据源对当前计算机上的所有用户都是可见的,包括NT服务。
  3. 文件DSN:ODBC文件数据源允许用户连接数据提供者,文件DSN可以由安装了相同驱动的用户共享,这是介于用DSN和系统DSN之间的一种共享情形
  4. 驱动程序:该选项卡列出了本机上所有安装的数据库驱动程序,其中包含每个驱动程序的名称、版本、供应商、驱动程序文件名及安装日期等。
  5. 跟踪:ODBC跟踪允许创建ODBC的日志,提供技术人员查看,可在该选项卡设置日志的路径和文件名。
  6. 连接池:连接池允许应用程序重用原来打开的连接句柄,这样可以节省到服务器的往返过程。

在Win10下可以执行"开始|控制面板|管理工具|数据源(ODBC)"命令,也可以CMD以管理员方式执行"odbcad32"命令,如图1所示。
CMD以管理员方式打开ODCB管理器

打开ODBC管理器界面如图2所示
图2 ODBC管理器界面

二、编程实现ODBC数据源的注册

(1)编程实现ODBC数据源的2种方法

事实上,完全可以使用Visual C++编程程序实现ODBC数据源的注册。实现的第1种方法是程序修改Windows注册表,程序员可以用Windows API函数增改HKEY_LOCAL_MACHINE\Software\ODBC下的ODBCINI中的键值,这种方法比较繁琐。这里主要介绍的是第2种方法,在程序中使用ODBC API的方法,使用API函数SQLConfigDataSource()来设置ODBC数据源。

BOOL SQLConfigDataSource(HWND hwndParent,UINT fRequest,LPCSTR lpszDriver,LPCSTR lpszAttributes);

其中,参数hwndParenty一般设置为NULL。
参数fRequest用于指明数据源的操作类型:

  • ODBC_ADD_DSN--加入一个新的用户数据源。
  • ODBC_CONFIG_DSN--修改一个存在的用户数据源
  • ODBC_REMOVE_DSN--删除一个存在的用户数据源
  • ODBC_ADD_SYS_DSN--增加一个新的系统数据源。
  • ODBC_CONFIG_SYS_DSN--修改一个存在的系统数据源
  • ODBC_REMOVE_SYS_DSN--删除一个存在的系统数据源
  • ODBC_REMOVE_DEFAULT_DSN--删除默认的数据源说明部分

参数lpszDriver为驱动器的描述字符串
参数lpszAttributes用于设置数据源的相关信息

(2)使用SQLConfigDataSource函数

要使用SQLConfigDataSource函数必须要用到odbccp32.dll,这里使用动态导入的方式导入odbccp32.dll。
首先新建一个MFC工程,然后在工程包含系统ODBCINST.H头文件,这里是在PCH.h文件中添加ODBCINST.H。

#include <odbcinst.h>

包含系统ODBCINST.H
由于是动态导入odbccp32.dll,还需要typedf定义SQLConfigDataSource函数。

typedef BOOL(WINAPI* SQLCONFIGDATASOURCE_FUNCTION)(HWND, DWORD, LPCSTR, LPCSTR);

这里配置的是连接MySQL数据,添加的是用户DSN

HINSTANCE h = ::LoadLibrary(L"C:\\Windows\\System32\\ODBCCP32.DLL");
SQLCONFIGDATASOURCE_FUNCTION pConfigDataSource;
pConfigDataSource = (SQLCONFIGDATASOURCE_FUNCTION)GetProcAddress(h, "SQLConfigDataSource");

if (!pConfigDataSource(NULL, ODBC_ADD_DSN, "MySQL ODBC 8.0 Unicode Driver", "DSN=test;" "DATABASE=student;"  "Setup=C:\Program Files\MySQL\Connector ODBC 8.0\myodbc8S.dll;" "NO_SCHEMA=1;" "PORT=3306;" "PWD=******;" "SERVER=localhost;""UID=root;"))
{

	AfxMessageBox(L"配置数据库失败!");
	return false;

}
else
{
	AfxMessageBox(L"配置数据库成功!");
}
::FreeLibrary(h);

在代码运行前,需要下载安装MySQL以及MySQL Connector/ODBC,安装完成后新建程序里面的数据库,此处使用的数据库DATABASE为student,用户UID为root,密码PWD自行设置。

安装的MySQL Connector/ODBC,版本为8.0

如果需要添加系统DSN,只需要将ODBC_ADD_DSN改成ODBC_ADD_SYS_DSN

HINSTANCE h = ::LoadLibrary(L"C:\\Windows\\System32\\ODBCCP32.DLL");
SQLCONFIGDATASOURCE_FUNCTION pConfigDataSource;
pConfigDataSource = (SQLCONFIGDATASOURCE_FUNCTION)GetProcAddress(h, "SQLConfigDataSource");

if (!pConfigDataSource(NULL, ODBC_ADD_SYS_DSN, "MySQL ODBC 8.0 Unicode Driver", "DSN=test;" "DATABASE=student;"  "Setup=C:\Program Files\MySQL\Connector ODBC 8.0\myodbc8S.dll;" "NO_SCHEMA=1;" "PORT=3306;" "PWD=******;" "SERVER=localhost;""UID=root;"))
{

	AfxMessageBox(L"配置数据库失败!");
	return false;

}
else
{
	AfxMessageBox(L"配置数据库成功!");
}
::FreeLibrary(h);

(3) 使用技巧

这个使用技巧是微软官方提供的,在数据源:以编程方式配置 ODBC 数据源中提供了对于不熟悉的数据的数据库的连接,怎么去快速的查找 参数lpszDriver和lpszAttributes 参数的键值?微软提供了下面的方法:

简单总结,就是先手动添加一个DSN,然后在注册表里面查看需要参数lpszDriver和lpszAttributes 参数的键值。
举个例子,我需要连接ACCESS数据库,但是我对于ACCESS数据库的参数lpszDriver和lpszAttributes 参数的键值不熟悉,就可以通过这个方法来获取。
首先手动添加一个ACCESS数据库文件Studen.mdb,然后再OBDC管理器上面添加ACCESS的用户DSN:Student



由于添加的是用户DSN,所以在注册表里面的路径为Computer\HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI
先在ODBC.INI中的ODBC Data Sources中找到Student,然后双击Student,复制"Value data"里面的值,这个值就是参数lpszDriver的值,此处为"Microsoft Access Driver (*.mdb, *.accdb)".

接着在ODBC.INI中找到Student,然后包含REG_SZ的键值对填入程序中

HINSTANCE h = ::LoadLibrary(L"C:\\Windows\\System32\\ODBCCP32.DLL");
SQLCONFIGDATASOURCE_FUNCTION pConfigDataSource;
pConfigDataSource = (SQLCONFIGDATASOURCE_FUNCTION)GetProcAddress(h, "SQLConfigDataSource");

if (!pConfigDataSource(NULL,ODBC_ADD_SYS_DSN,"Microsoft Access Driver (*.mdb, *.accdb)","DSN=Tset15\0" "DBQ=E:\Test\Student.mdb\0" "Driver=C:\PROGRA~1\COMMON~1\MICROS~1\OFFICE16\ACEODBC.DLL\0" "APILevel =1\0" "ConnectFunctions=YYN\0" "DriverODBCVer=02.50\0" "FileExtns=*.mdb,*.accdb\0" "FileUsage=2\0" "Setup=C:\PROGRA~1\COMMON~1\MICROS~1\OFFICE16\ACEODBC.DLL\0" "SQLLevel=0\0" "FIL=MS Access\0\0"))
{

	AfxMessageBox(L"配置数据库失败!");
	return false;

}
else
{
	AfxMessageBox(L"配置数据库成功!");
}

::FreeLibrary(h); 

如果添加的是系统DSN,在注册表里面的路径为Computer\HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI

(4)踩坑日记

在Win10进行系统DSN添加时,怎么添加都不成功,后面猜想可能时软件权限的问题,于是在项目管理属性里面给生成的MFC程序添加了管理员权限,终于能成功添加了

或者将项目生成的exe以管理员的身份运行可以正常连接