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

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

时间:2023-11-23 12:00:13浏览次数:42  
标签:pConfigDataSource MFC 数据源 数据库 ODBC 用户 DSN API

一、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以管理员的身份运行可以正常连接

标签:pConfigDataSource,MFC,数据源,数据库,ODBC,用户,DSN,API
From: https://www.cnblogs.com/leeyilong/p/17850821.html

相关文章

  • .NET8:快速集成Rapid.NET三维控件
    .NET8正式版本发布了,AnyCADRapid.NET针对.NET8进行了升级和优化。本文以WPF项目为例介绍在.NET8中使用AnyCADRapid.NET三维控件。1从.NET6升级若之前使用NET6升级到.NET8,升级过程非常简单,升级到AnyCADRapid.NET最新版本后,仅需要更改以下两处:(1).csproj文件<TargetFramewor......
  • 关于FastAPI与Vue3的通信
    学习一下前后端分离技术,前端采用三大框架之一的Vue.js,后端则采用Python的FastAPI框架。一、前端设计1.建目录mydemo2.在mydemo目录下打开命令行,运行:npminitvue@latest(这里如果cmd卡死了,就ctrl+C结束,再次运行npminitvue@latest)3.工程名设置为 frontend ,其余按默......
  • Windows下mDNS查询API—DnsStartMulticastQuery/DnsStopMulticastQuery的使用
    背景及问题:目前很多局域网设备通过mNDS协议实现互联,IP地址为自动IP段-169.254.x.x,有时候设备厂家提供的API需要通过知晓局域网中的IP地址/设备名,才能连接该设备。这样要求每个软件必须配置设备名或者启动时遍历所有IP(6w+),不是很方便,这时候可以通过mDNS查询,自动拿到设备名,再进行连......
  • Reflect API:每个 JavaScript 开发人员都需要的瑞士军刀
    前言您是否曾经希望拥有一个神奇的工具包,可以让您像超级英雄一样控制JavaScript对象?向ReflectAPI打个招呼吧,它是ES6中引入的一个新的全局对象,它能够处理简单的代码操作。它是每个现代JavaScript开发人员都需要的瑞士军刀!......
  • 基于go-zero的api网关示例
    以下是基于go-zero框架的API网关示例。这个示例包括一个简单的API网关,它接收HTTP请求,将请求路由到不同的服务,并返回响应。创建项目首先,在go-zero仓库中创建一个新的目录:mkdirapi-gatewaycdapi-gateway创建Go文件在api-gateway目录下创建以下三个文件:c......
  • Java Stream中的API你都用过了吗?
    公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。在本教程中,您将通过大量示例来学习Java8StreamAPI。Java在Java8中提供了一个新的附加包,称为java.util.stream。该包由类、接口和枚举组成,允许对元素进行函数式操作。您可以通过在程序中......
  • C/C++ 使用API实现数据压缩与解压缩
    在Windows编程中,经常会遇到需要对数据进行压缩和解压缩的情况,数据压缩是一种常见的优化手段,能够减小数据的存储空间并提高传输效率。Windows提供了这些API函数,本文将深入探讨使用WindowsAPI进行数据压缩与解压缩的过程,主要使用ntdll.dll库中的相关函数。关键函数介绍RtlGetComp......
  • WIZnet socket API 前言
    WIZnetsocketAPIWIZnetsocketAPIs基于BerkeleysocketAPIs,因此有着相似的名字和接口。但是也是有着些许的不同。APIWIZnetBerkeleysocket()OObind()XOlisten()OOconnect()OOaccept()XOrecv()OOsend()OOrecvfrom()OO......
  • Civil 3D使用COM API时对象版本号的查询方法
     查询对象版本有多种方法,方法一:在developer'sguide中查找,APIDeveloper'sGuide→AbouttheDeveloper'sGuide→NewFeaturesintheAutoCADCivil3DAPI→COMChanges这里有详细的介绍,不仅有当前的版本,还有上一版的版本号。方法二:在AutoCAD命令行中输入命令AeccVersio......
  • wxid批量转换微信号接口工具,自动转换二维码,开源API分享!
    这个是今天客户定制的,就是从微信群导出了很多WXID,然后实现通过WXID加好友,我就直接调用了微信的接口,说明一下这是微信公开的接口,不存在HOOK或者是逆向技术存在的,公开接口,任何人都可以调用,我就是把接口通过易语言实现了批量生成的功能效果。界面图:  WXID添加效果,不是微信号,是......