MFC-ODBC API动态连接配置数据库
一、ODBC管理器介绍
在Window中,ODBC数据远管理器有6个标签:用户DSN、系统DSN、文件DSN、驱动程序、跟踪、连接池,通常情况下,使用用户DSN或者系统DSN,这里主要了解用户DSN和系统DSN即可。
- 用户DSN:ODBC用户数据源存储了如何与指定的数据库提供者连接的信息,只有当前用户可见。
- 系统DSN:ODBC系统数据源存储了如何与指定数据库提供者连接的信息,系统数据源对当前计算机上的所有用户都是可见的,包括NT服务。
- 文件DSN:ODBC文件数据源允许用户连接数据提供者,文件DSN可以由安装了相同驱动的用户共享,这是介于用DSN和系统DSN之间的一种共享情形
- 驱动程序:该选项卡列出了本机上所有安装的数据库驱动程序,其中包含每个驱动程序的名称、版本、供应商、驱动程序文件名及安装日期等。
- 跟踪:ODBC跟踪允许创建ODBC的日志,提供技术人员查看,可在该选项卡设置日志的路径和文件名。
- 连接池:连接池允许应用程序重用原来打开的连接句柄,这样可以节省到服务器的往返过程。
在Win10下可以执行"开始|控制面板|管理工具|数据源(ODBC)"命令,也可以CMD以管理员方式执行"odbcad32"命令,如图1所示。

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

二、编程实现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>

由于是动态导入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以管理员的身份运行可以正常连接
MFC-ODBC API动态连接配置数据库的更多相关文章
- Hibernate根据方言dialect动态连接多数据库
Hibernate根据方言dialect动态连接多数据库 由于最近需要在web项目中动态链接不同地址的数据库,且要链接的子数据库的信息在总数据库(即web项目的主数据库)的表中,所以动手写了一个类. ...
- SharePoint服务器将连接配置数据库的连接字符串保存在什么地方?
经常有人问我这个问题,SharePoint服务器将连接配置数据库的连接字符串保存在什么地方?虽然其他SharePoint服务器场设置都是保存到了配置数据库里面,但连接配置数据库本身的连接字符串,肯定是 ...
- C++ API方式连接mysql数据库实现增删改查
这里复制的 http://www.bitscn.com/pdb/mysql/201407/226252.html 一.环境配置 1,装好mysql,新建一个C++控制台工程(从最简单的弄起,这个会了, ...
- MFC实现登录对话框连接access数据库方式
编写一个简单的登录对话框 大家好,我们利用MFC编写一个简单的登录对话框.主窗体是单文档界面.程序运行的时候,先弹出一个简单的登录对话框,输入用户名和密码后主窗体显示出来. 1.开打VC++6.0.点 ...
- php连接Access数据库错误及解决方法
<?php $connstr="DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath("data.m ...
- JDBC-ODBC桥接器连接Access数据库
今天,遇到一个问题,虽然不是什么大难题,但对于初学者来说也缠绕了我好久!(好气哦) 问题: 运行jsp项目连接不上数据库: java.sql.SQLException: [Microsoft][ODB ...
- Java Web项目中连接Access数据库的配置方法
本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...
- 【数据库】MFC ODBC(一)
一.动态创建ODBC数据源 ODBC API提供了动态创建数据源的函数SQLConfigDataSource.该函数的原型如下: BOOL SQLConfigDataSource ( HWND hwn ...
- C连接MySQL数据库开发之Windows环境配置及测试
一.开发环境 Win8.1 64位.VS2013.MySQL5.5.3764位 MySQL安装目录为:C:\Program Files\MySQL\MySQL Server 5.5 二.配置工程环境 ...
- Windows下使用ODBC API访问数据库之关键
本文采用SQL2005 + VS2008环境,以ODBC API方式成功连接数据库. 1.SQL安装和环境配置 这部分网上随便搜一下都有很多资料,而且很容易就可以配置成功. 注意的关键点: SA账号配 ...
随机推荐
- 【C++】在搞touchgfx时遇见了一个初始化列表顺序与类中定义不一致的问题,error:when initialized here [-Werror=reorder]
在搞touchgfx时遇见了一个初始化列表顺序与类中定义不一致的问题,error:when initialized here [-Werror=reorder] 初始化列表顺序与类中定义顺序不一致错误 ...
- 小程序:Now you can provide attr `wx:key` for a `wx:for` to improve performance. 的解决方案
在wx:for后面添加wx:key="key" 可消除警告 <view wx:for="{{thisWeekMovies}}" wx:for-index= ...
- Android——SQLiteOpenHelper
使用步骤: 新建一个继承自SQLiteOpenHelper的数据库操作类,提示重写onCreate和OnUpgraed两个方法.其中,onCreate方法只在第一次打开数据库时执行,在此可进行表结构创 ...
- http-长连接
1. 短链接 http1.0 -- 1个请求-响应过程会创建且1个新的连接 2. 长连接 http1.1 -- 同域下可以创建1个tcp连接,多个请求在同一个tcp上串行处理请求 http2.0 -- ...
- [转帖]SQL Server 性能调优
性能调优2:CPU 关系型数据库严重依赖底层的硬件资源,CPU是服务器的大脑,当CPU开销很高时,内存和硬盘系统都会产生不必需要的压力.CPU的性能问题,直观来看,就是任务管理器中看到的CPU ...
- [转帖]在麒麟linux上安装Postgresql12.5
https://jimolonely.github.io/tech/linux/install-postgresql-kylin/ 本文主要实践在麒麟V10版本上通过源码编译安装PostgreSQL1 ...
- [转帖]金仓数据库KingbaseES误删除系统超级用户(superuser)权限的恢复方式
https://blog.csdn.net/arthemis_14/article/details/129879269 在使用KingbaseES数据库的时候,系统默认存在一个跟系统初始化用户同名的S ...
- [转帖]kafka搭建kraft集群模式
kafka2.8之后不适用zookeeper进行leader选举,使用自己的controller进行选举 1.准备工作 准备三台服务器 192.168.3.110 192.168.3.111 192. ...
- [转帖]Kafka关键参数设置
https://www.cnblogs.com/wwcom123/p/11181680.html 生产环境中使用Kafka,参数调优非常重要,而Kafka参数众多,我们的java的Configurat ...
- [转帖]vCenter使用 VMCA 续订证书:续订证书时发生意外错误
https://www.dinghui.org/vcenter-sts-certificate.html 起因:有一处客户vCenter告警:STS签名证书即将过期. 处理办法:系统管理-证书-证书管 ...