一、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所示。

打开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动态连接配置数据库的更多相关文章

  1. Hibernate根据方言dialect动态连接多数据库

    Hibernate根据方言dialect动态连接多数据库 由于最近需要在web项目中动态链接不同地址的数据库,且要链接的子数据库的信息在总数据库(即web项目的主数据库)的表中,所以动手写了一个类. ...

  2. SharePoint服务器将连接配置数据库的连接字符串保存在什么地方?

    经常有人问我这个问题,SharePoint服务器将连接配置数据库的连接字符串保存在什么地方?虽然其他SharePoint服务器场设置都是保存到了配置数据库里面,但连接配置数据库本身的连接字符串,肯定是 ...

  3. C++ API方式连接mysql数据库实现增删改查

    这里复制的 http://www.bitscn.com/pdb/mysql/201407/226252.html 一.环境配置 1,装好mysql,新建一个C++控制台工程(从最简单的弄起,这个会了, ...

  4. MFC实现登录对话框连接access数据库方式

    编写一个简单的登录对话框 大家好,我们利用MFC编写一个简单的登录对话框.主窗体是单文档界面.程序运行的时候,先弹出一个简单的登录对话框,输入用户名和密码后主窗体显示出来. 1.开打VC++6.0.点 ...

  5. php连接Access数据库错误及解决方法

    <?php $connstr="DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath("data.m ...

  6. JDBC-ODBC桥接器连接Access数据库

    今天,遇到一个问题,虽然不是什么大难题,但对于初学者来说也缠绕了我好久!(好气哦) 问题: 运行jsp项目连接不上数据库: java.sql.SQLException: [Microsoft][ODB ...

  7. Java Web项目中连接Access数据库的配置方法

    本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...

  8. 【数据库】MFC ODBC(一)

    一.动态创建ODBC数据源 ODBC API提供了动态创建数据源的函数SQLConfigDataSource.该函数的原型如下: BOOL SQLConfigDataSource ( HWND hwn ...

  9. C连接MySQL数据库开发之Windows环境配置及测试

    一.开发环境 Win8.1 64位.VS2013.MySQL5.5.3764位 MySQL安装目录为:C:\Program Files\MySQL\MySQL Server 5.5 二.配置工程环境 ...

  10. Windows下使用ODBC API访问数据库之关键

    本文采用SQL2005 + VS2008环境,以ODBC API方式成功连接数据库. 1.SQL安装和环境配置 这部分网上随便搜一下都有很多资料,而且很容易就可以配置成功. 注意的关键点: SA账号配 ...

随机推荐

  1. 【rt-thread】Kconfig文件添加子Kconfig文件时是以顶级Kconfig所在目录为当前路径的

    示例如下 顶级Kconfig文件所在目录 子级Kconfig文件所在目录 子级Kconfig文件添加次子级Kconfig文件,以顶级目录为当前路径依次写出次子级Kconfig文件所在目录

  2. [转帖]资料整理——Oracle版本历史(很全面)(Releases and versions of Oracle Database)

    资料来源: https://en.wikipedia.org/wiki/Oracle_Database Oracle Database Version Initial Release Version ...

  3. [转帖]gdb调试常见命令详细总结(附示例操作)

    一.简介 通过gdb调试我们可以监控程序执行的每一个细节,包括变量的值.函数的调用过程.内存中数据.线程的调度等,从而发现隐藏的错误或者低效的代码,程序的调试过程主要有:单步执行,跳入函数,跳出函数, ...

  4. [转帖]高性能网络实战:借助 eBPF 来优化负载均衡的性能

    https://zhuanlan.zhihu.com/p/592981662 网络性能优化,eBPF 是如何发挥作用的呢? 本篇文章,我就以最常用的负载均衡器为例,带你一起来看看如何借助 eBPF 来 ...

  5. [转帖]Windows磁盘性能压测(1)-DiskSpd

    http://www.manongjc.com/detail/59-xrydhtisrajqsxn.html 本文章向大家介绍Windows磁盘性能压测(1)-DiskSpd,主要内容包括其使用实例. ...

  6. [转帖][问题已处理]-kubernetes中2次不同的oom处理

    https://dandelioncloud.cn/article/details/1598699030236577793 起因: 同事反馈 服务挂了,kuboard上查看是服务挂掉了,livenes ...

  7. Operating.System.Concepts.10th.Edition中文翻译

    <操作系统概念>是一本很好的书,主要介绍了操作系统的各个层面的概念,包含CPU调度,内存处理,文件系统等,目前已经出到第10版,是一本非常经典的书籍,从第1版至今被国内外众多高校选作教材, ...

  8. CDP技术系列(一):使用bitmap存储数十亿用户ID的标签或群体

    一.背景介绍 CDP系统中目前存在大量由用户ID集合组成的标签和群体,截止当前已有几千+标签,群体2W+. 大量的标签都是亿级别数据量以上,例如性别.职业.学历等均,甚至有群体中的ID数量达到了数十亿 ...

  9. 京东金融APP-新交互技术“虚拟数字人”赋能世界杯主题营销

    作者:平台研发部,智能服务与产品部 距离加文·伍德提出web3.0已经过去8年时间,这8年加文·伍德创建的以太坊大放异彩,同时由web3.0引出的数字人.元宇宙也生根发芽,茁壮成长,带来了非凡的用户体 ...

  10. linux如何配置ssh密钥登录

    为什么要用ssh密钥登录 购买的服务器设置密码很容易被暴力破解,用密钥登录安全很多.root用户新建的用户也要用密钥登录更安全,如果一直su - 用户名登录 不方便 用xftp等服务上传文件到用户使用 ...