一、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. Elasticsearch 索引与文档的常用操作总结二:复杂条件查询

    本文为博主原创,未经允许不得转载: 1.  查询所有:match_all GET /es_db/_doc/_search { "query":{ "match_all&q ...

  2. 基于Html+腾讯云播SDK开发的m3u8播放器

    周末业余时间在家无事,学习了一下腾讯的云播放sdk,并制作了一个小demo(m3u8播放器),该在线工具是基于腾讯的云播sdk开发的,云播sdk非常牛,可以支持多种播放格式. 预览地址 m3u8pla ...

  3. CentOS7挂载webdav添加开机启动

    CentOS7挂载webdav添加开机启动 一.安装davfs2 yum install davfs2 二.挂载 1.新建挂载位置 mkdir -p /guazai chmod +x /guazai ...

  4. Go-值传递&引用传递

    值类型和引用类型 值类型关注其值 引用类型关注其指针 值类型和引用类型区别在于传递值的时候拷贝的对象不同,值传递拷贝是变量的值,引用传递拷贝的是变量的指针 拷贝 -- 传递值 赋值 函数调用 初始化 ...

  5. [转帖]Linux fsync和fdatasync系统调用实现分析(Ext4文件系统)

      转自:https://blog.csdn.net/luckyapple1028/article/details/61413724 在Linux系统中,对文件系统上文件的读写一般是通过页缓存(pag ...

  6. [转帖]Jmeter学习笔记(二十三)——生成HTML性能报告

    https://www.cnblogs.com/pachongshangdexuebi/p/11759316.html 有时候我们写性能报告的时候需要一些性能分布图,JMeter是可以生成HTML性能 ...

  7. [转帖]看看 Jmeter 是如何玩转 redis 数据库的

    柠檬小欧 2021-08-31 20:06420 Jmeter 作为当前非常受欢迎的接口测试和性能测试的工具,在企业中得到非常广泛的使用,而 Redis 作为缓存数据库,也在企业中得到普遍使用,那如何 ...

  8. [转帖]013 Linux 搞懂「文件所属者更改及权限的赋予」从未如此简单 (chmod、chgrp、chown)

    https://my.oschina.net/u/3113381/blog/5435014   01 一图详解「ls -l」 02 两种符号区分表示文件和目录 -(横线) # 表示非目录文件 d # ...

  9. [转帖]Strace + pstack发现耗时点

    https://www.jianshu.com/p/10ea6fff562c 如何使用strace+pstack利器分析程序性能 本文摘抄自如何使用strace+pstack利器分析程序性能 程序说明 ...

  10. 【转】Java类加载器:类加载原理解析

    [转]Java类加载器:类加载原理解析 https://www.jianshu.com/p/1f704ad4196e 摘要: 每个开发人员对java.lang.ClassNotFoundExcetpi ...