在VC中动态加载ODBC的方法

ODBC连接数据库实例 2012-12-13 22:27 (分类:默认分类) 1.首先建立数据源,正常情况下载控制面板-管理工具-数据源,打开后有用户DSN系统DSN 两者区别在于系统级的DSN,就是对该系统的所有登录用户可用,用户DSN是只对建立它的用户可用 2.配置自己的DSN,比如连接ACCESS数据库 单击“添加”按钮,显示“创建新数据源”对话框。选择“Microsoft Access Drive 阅读详情

在VC中动态加载ODBC的方法

    在使用VC、VB、Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置ODBC数据源。对于一般用户而言,配置ODBC数据源可能是一件比较困难的工作。而且,在实际应用中,用户往往要求在同一个应用程序中访问不同的数据源,因此采用一般的加载方法就有了无法克服的缺陷。为能在程序中完成这一工作,方便应用程序的使用,本文以VC为开发环境介绍两种在应用程序中动态加载ODBC系统数据源的方法。

方法一:修改注册表

设计思路

    一般情况下,当用户在控制面板中配置好ODBC数据源后,Windows系统便在注册表中加入了一些子键来存储用户的配置结果。当应用程序需要用到数据源时,Windows便会通知底层接口查阅注册表中该数据源的配置。如果用户删除了某个ODBC数据源,那么也会在注册表中有所反应。如果配置的数据源是用户数据源, Windows系统便会修改注册表的HKEY_CURRENT_USER/SOFTWARE/ODBC/ODBC.INI子键;如果配置的数据源是系统数据源,Windows系统便会修改注册表的HKEY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBC.INI主键。因此,我们可以在应用程序中使用Windows API中的注册表编辑函数来完成Windows所做的工作,这样就可以达到动态加载数据源的目的。

具体实现

    对于不同类型的数据源,注册表的修改也各有不同,但基本上都要修改两个地方。一个是在 ODBC.INI子键下建立一个与数据源描述名同名的子键,并在该子键下建立与数据源配置相关的项;另一个是在ODBC.INI/ODBC Data Sources子键下建立一个新项以便告诉驱动程序管理器ODBC数据源的类型。下面以配置一个Microsoft Access数据源为例给出实现此功能的函数的代码。

/*strSourceName是要创建的数据源名,strSourceDb是数据库存放路径,strDescription是数据源的描述字符串。*/

BOOL CLoadOdbcDlg::LoadDbSource(CString strSourceName, CString strSourceDb, CString strDescription)
{
  //存放打开的注册表键
  HKEY hKey;
  DWORD dw;

  //存放注册表API函数执行的返回值
  LONG lReturn;

  //存放要打开的子键
  CString strSubKey;

  //检测是否安装了MS Access ODBC driver:odbcjt32.dll
  //获得 Windows系统目录
  char sysDir[MAX_PATH];
  char drvName[]="//odbcjt32.dll";
  ::GetSystemDirectory(sysDir, MAX_PATH);
  strcat(sysDir,drvName);
  CFileFind findFile;
  if(!findFile.FindFile(sysDir))
  {
    AfxMessageBox("您的计算机系统中没有安装MS Access的ODBC驱动程序odbcjt32.dll,您将无法加载该类数据源。" ,MB_OK | MB_ICONSTOP);
    return false;
  }

  strSubKey="SOFTWARE//ODBC//ODBC.INI//" + strSourceName;
  //创建 ODBC数据源在注册表中的子键
  lReturn=::RegCreateKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)strSubKey, 0, NULL, REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hKey,&dw);
  if(lReturn != ERROR_SUCCESS)
    return false;

  //设置数据源的各项参数
  CString strDbq = strSourceDb;
  CString strDriver = sysDir;
  DWORD dwDriverId = 25;
  CString strFil = "MS Access;";
  CString strPwd = strSourceName;
  DWORD dwSafeTransactions = 0;
  CString strUid = strSourceName;
  ::RegSetValueEx(hKey, "DBQ", 0L, REG_SZ, (CONST BYTE*)((LPCTSTR)strDbq), strDbq.GetLength());
  ::RegSetValueEx(hKey, "Description", 0L, REG_SZ, (CONST BYTE*)((LPCTSTR)strDescription), strDescription.GetLength());
  ::RegSetValueEx(hKey, "Driver", 0L, REG_SZ, (CONST BYTE*)((LPCTSTR)strDriver), strDriver.GetLength());
  ::RegSetValueEx(hKey, "DriverId", 0L, REG_DWORD, (CONST BYTE*)(&dwDriverId), sizeof(dw));
  ::RegSetValueEx(hKey, "FIL", 0L, REG_SZ, (CONST BYTE*)((LPCTSTR)strFil),strFil .GetLength ());
  ::RegSetValueEx(hKey, "PWD", 0L, REG_SZ, (CONST BYTE*)((LPCTSTR)strPwd),strPwd.GetLength ());
  ::RegSetValueEx(hKey, "SafeTransactions", 0L, REG_DWORD, (CONST BYTE*)(&dwSafeTransactions), sizeof(dw));
  ::RegSetValueEx(hKey, "UID", 0L, REG_SZ, (CONST BYTE*)((LPCTSTR)strUid),strUid.GetLength());
  ::RegCloseKey(hKey);

  //创建 ODBC数据源的Jet子键
  strSubKey += "//Engines//Jet";
  lReturn = ::RegCreateKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)strSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dw);
  if(lReturn != ERROR_SUCCESS)
    return false;

  //设置该子键下的各项参数
  CString strImplict="";
  CString strUserCommit="Yes";
  DWORD dwPageTimeout=5;
  DWORD dwThreads=3;
  DWORD dwMaxBufferSize=2048;
  ::RegSetValueEx(hKey, "ImplicitCommitSync", 0L, REG_SZ, (CONST BYTE*)((LPCTSTR)strImplict), strImplict.GetLength()+1);
  ::RegSetValueEx(hKey, "MaxBufferSize", 0L, REG_DWORD, (CONST BYTE*)(&dwMaxBufferSize), sizeof(dw));
  ::RegSetValueEx(hKey, "PageTimeout", 0L, REG_DWORD, (CONST BYTE*)(&dwPageTimeout), sizeof(dw));
  ::RegSetValueEx(hKey, "Threads", 0L, REG_DWORD, (CONST BYTE*)(&dwThreads), sizeof(dw));
  ::RegSetValueEx(hKey, "UserCommitSync", 0L, REG_SZ, (CONST BYTE*)((LPCTSTR)strUserCommit), strUserCommit.GetLength());
  ::RegCloseKey(hKey);

  //设置ODBC数据库引擎名称
  lReturn=::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE//ODBC//ODBC.INI//ODBC Data Sources", 0L, KEY_WRITE, &hKey);
  if(lReturn != ERROR_SUCCESS)
    return false;
  CString strDbType="Microsoft Access Driver (*.mdb)";
  ::RegSetValueEx(hKey, strSourceName, 0L, REG_SZ, (CONST BYTE*)((LPCTSTR)strDbType), strDbType.GetLength());

  return true;
}

由于在动态加载中,一般只会改变数据库文件、数据源说明以及数据源描述,故上述函数可以实现应用中的大部分要求。如果应用中还需要作更多的改变,那么也可以通过改变函数参数的方式加以实现。对于需要动态加载多种类型数据源的情况,可以用具有不同参数的重载函数去实现。

方法二:利用DLL

设计思路

    Windows系统子目录中的动态链接库Odbcinst.dll提供了一个可以动态地增加、修改和删除数据源的函数SQLConfigDataSource()。该函数的原型如下:

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

hwndParent参数是父窗口句柄。如果该值为NULL,将不会显示与父窗口有关的对话框。

fRequest参数可以设置为下面的数值之一:

  ODBC_ADD_DSN:增加一个新的用户数据源;
ODBC_CONFIG_DSN:修改(配置)一个已经存在的用户数据源;
ODBC_REMOVE_DSN:删除一个已经存在的用户数据源;
ODBC_ADD_SYS_DSN:增加一个新的系统数据源;
ODBC_CONFIG_SYS_DSN:修改 (配置)一个已经存在的系统数据源;
ODBC_REMOVE_SYS_DSN:删除一个已经存在的系统数据源。

  lpszDriver参数用于传递数据库引擎的名字,等同于方法一中strDbType变量。

  lpszAttirbutes参数是关键字的值,即一连串的"keyname=value"字符串,每两个字符串之间用 "/"隔开,如 DSN = Personnel Data/0UID=Smith/0DATABASE=Personnel。关于该参数的详细设置请参阅MSDN中SQLConfigDataSource()函数的帮助文档和各种ODBC驱动程序文档。

具体实现

    由于VC的缺省库文件中不包含SQLConfigDataSource()函数,因此使用该函数之前需要将odbcinst.h文件包含在工程的头文件中,在工程的Settings属性对话框Link属性页的Object/library modules编辑框中增加odbccp32.lib,同时保证系统目录system32下有文件odbccp32.dll。

   仍以Microsoft Access为例,设置数据源名为demo,数据源描述为"示例数据源",那么在需要动态加载数据源的地方加入下列代码即可:
 
    ::SQLConfigDataSource(NULL, ODBC_ADD_SYS_DSN, "Microsoft Access Driver (*.mdb)", "DSN=demo/0Description=示例数据库");

小结

    上述两种方法都可以实现动态加载各种类型的ODBC数据源,并且在Windows95/98/NT/2000环境下调试通过。方法一在实现时需要较多的代码,方法二所需代码虽少,但需要额外文件的支持,而且随着数据源配置的灵活性的增加,为了形成lpszAttributes字符串,其代码长度也会相应增加。由于从控制面板配置数据源使得程序员可以获得更加直观的理解,所以对于注册表中各项值以及相应项名称的获得除了可以查阅相关驱动程序的文档外,程序员也可以在编程前先通过控制面板配置ODBC数据源,然后根据注册表中相应部分的内容进行编程。


ADO与ODBC用法 一、概念 ODBC ODBC 是 开放式数据库互连 是一些标准规范符合规范的数据库就可以通过SQL(结构化查询语言)编写的百命令进行操作.理解ODBC是种数据库互连标准就行了,WINDOWS中ODBC配置,只是对数据库进行系统中登记操作一样,不起任何数据服务作用. OLE DB OLE DB 是 数据库嵌入对象,是一套度组件对象模型 (COM) 接口,可提供对存储在不同信息源中的数据进行统一访问的能力。即:通过这个对象可以对数据库操专作属.但他只是数据库的一个接口.因为要统一许多接口,它接口也变的复杂繁多, 阅读详情

相关推荐

64位MySQL ODBC连接器与VC2013运行库完整安装包

回顾整篇文章,我们聊了协议、讲了架构、看了代码、做了部署,但最想传达的一个观点是:MySQL Connector/ODBC 不只是一个驱动,它是连接过去与未来、异构与统一的关键基础设施。它让那些写着 COBOL、VB6、Delphi 的“老古董”系统依然能够参与数字化转型;它让 Excel 用户也能成为数据分析师;它让企业可以用最低的成本完成数据库迁移和平滑升级。在这个微服务、云原生、Kubernetes 当道的时代,也许你会觉得 ODBC “太老了”。

weixin_42588877的博客 691

C++通过ADO访问数据库的连接字符串

C++通过ADO访问数据库的连接字符串

深之JohnChen的专栏 4918

Visual C++环境中MySQL ODBC驱动程序数据库连接实操

本文还有配套的精品资源,点击获取 简介:本主题旨在介绍如何在Visual C++(VC)开发环境下,通过MySQL ODBC驱动程序mysec odbc driver 3.51建立数据库连接。详细解释了ODBC的基本概念、特定驱动程序的安装与配置,以及在VC中使用ODBC API执行数据库操作。此外,涵盖了OLE DB和ADO连接方式、安全性与兼容性考虑、错误处理技巧和性能...

weixin_36178216的博客 2060

由于编码问题引发的ODBC插入数据库中文错误

 一:问题: 用ODBC将字符数据插入数据库后,数据库中显示中文格式乱码,而英文格式完全正确,用ODBC进行查询操作完全正确。 如下所示 二:解决问题: 查看编码方式是否统一。 1.首先查看数据库分别是什么编码格式: 2.查看插入的表格是什么格式: 3.查看ODBC进行连接是的字符集。 我的数据源配置文件显示如下: 到目前为止,发现插入用和表

tao546377318的博客 9212

数字锁相环的原理与FPGA实现

数字锁相环是锁相环电路的全数字实现。锁相环电路能够实现对输入信号的相位进行跟踪,进而在噪声中提取纯净的有用信号。以上就是今天要讲的内容,本文简单地介绍了锁相环的原理,然后,在Vivado仿真平台上,通过verilog做仿真验证。最终仿真结果能够实现锁定,但锁定时间较长,表明参数仍可做调整。

weixin_45857378的博客 8511

scRNA-seq的fastq文件处理流程——持续更新

获得了一批新的scRNA-seq的fastq.gz文件,每个样本的数据形式为: 我打算使用10X cellranger处理fastq.gz文件,下载及安装方式在官网:https://support.10xgenomics.com/single-cell-gene-expression/software/downloads/2.0这个网址写了10X cellranger处理fastq.gz文件的命名规则https://support.10xgenomics.com/single-cell-gene-expr

watermel__的博客 3199

Visual C++中为普通程序添加ODBC应用

一、 引言  数据库属于最流行的应用程序之一,几乎每个商业部门都使用数据库来记录、管理各种各样的数据。在VC下我们可以在创建工程时选择数据库支持,并选定数据源和相关的表,并选择CRecordView作为我们这个程序的基类,这样做可以毫不费力的将应用程序和数据库建立了关联,而几乎不用编什么代码,但这样做的前提是在新建工程时已明确知道用到哪个数据库,并且有相关的数据库。事实上我们往往有许多已做好的应用

fxpopboy的博客 745

Moltemplate建模----水盒子data文件

1功能介绍 Moltemplate是LAMMPS官方支持的建模工具之一,适用于LAMMPS建模。该程序创建了一种简单的文件格式来存储分子定义和力场,即模板LT。LT文件包含与特定分子有关的所有文本(包括坐标,键拓扑,角度,力场参数,约束,组和修复)。 Moltemplate可以复制分子,对其进行自定义,然后用它作为构建更大、更复杂分子的基础。构建后,可以自定义...

元素魔方科研服务 2598

mysql odbc.ini_odbc.ini配置 mysql

如何一步步配置ORACLE_O... 6页 免费 mysql怎样配置ODBC数据源... 6页 免费 win7配置ODBC数据源 6页 免费 ODBC数据源配置详细说明 3页 免费 BIEE配置......测试是.odbc.ini 配置文件是否正确 用 dbping -m -d -c ...Windows Registry Editor Version 5.00 [HKEY_CURRENT...

weixin_42407739的博客 1841

主板USB接口全部失效解决方案(通用串行总线USB控制器有黄色叹号)保姆级教程亲测有效

通用串行总线控制器总是有叹号解决办法 办公室的崩腾时代老电脑,疫情期间没人用,来了开机之后发现鼠标键盘都用不了,本以为是主机放时间长出了问题,后来想起来就百度了“鼠标键盘都失效”的标题,结果发现了“串行总线控制器总是感叹号”的关联问题。正好办公室电脑都装有teamviwer常用来远程办公(在家偷懒)。所以通过远程发现电脑室可以运行的。并在控制面板发现:通用串行总线控制器总是感叹号,插入外设时USB无反应。如图:​ 并且右键选中其中一个,点击最后一个选项:“属性” 可以发现“设备状态”中会提示“由...

xiao_bai_0_0的博客 2万+

从入门到实战:openEuler 系统管理与运维笔记(持续更新)

本文为openEuler系统管理与运维的实战笔记,从CentOS迁移者视角切入,详细介绍了openEuler的生态兼容性、内核优化及安全特性。内容涵盖系统安装规划、虚拟机部署、基础命令操作、文件系统管理以及用户权限配置等核心运维技能,旨在帮助读者快速上手并掌握这一企业级操作系统的日常管理。

weixin_29207149的博客 223

VC中动态加载ODBC解决方法

在使用 VC、 VB、 Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置 ODBC数据源。对于一般用户而言,配置 ODBC数据源可能是一件比较困难的工作。  而且,在实际应用中,用户往往要求在同一个应用程序中访问不同的数据源,因此采用一般的加载方法就有了无法克服的缺陷。为能在程序中完成这一工作,方便应用程序的使用,本文以 VC为开发环境介绍两种在应用程序中动...

SurpassLi的专栏 122

ABAP CDS View 从入门到精通教程第一篇:ABAP CDS View 在 SAP 技术体系中的重要地位

摘要:本文介绍了SAP开发技术专家提供的多套SAP开发教程,涵盖ABAP、UI5、Fiori、OData、BTP等技术领域。重点阐述了ABAP CDS View在SAP S/4HANA中的核心地位,作为虚拟数据模型(VDM)的关键技术,它实现了OLTP和OLAP的统一处理。文章还说明了学习CDS View的前置条件,包括需要SAP NetWeaver 7.50 SP01或更高版本系统,以及使用SAP ABAP Development Tool进行开发实践。作者具有16年SAP开发经验,这些教程形成了完整的S

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 899

VC其它- 在VC中动态加载ODBC的方法

  在VC中动态加载ODBC的方法   在使用VC、VB、Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置ODBC数据源。对于一般用户而言,配置 ODBC数据源可能是一件比较困难的工作。而且,在实际应用中,用户往往要求在同一个应用程序中访问不同的数据源,因此采用一般的加载方法就有了无法克服的缺陷。为能在程序中完成这一工作,方便应用程序的使用,本文以VC为

MasterFT的专栏 1138

把 SAP Query 用到极致:ABAP Query 的核心概念、配置流程、权限与运输治理全解析

摘要:SAP Query 是一款面向业务用户的自助报表工具,可解决标准报表无法满足业务需求的问题。其核心由四大组件构成:Queries(报表定义)、InfoSets(数据视图)、User Groups(权限分组)和Translation(多语言支持)。通过SQ03、SQ02、SQ01事务码分步创建用户组、数据视图和查询,业务用户无需ABAP知识即可生成Basic List(明细)、Statistics(统计)和Ranked List(排名)三种报表形式。典型案例展示了如何为采购部门设计包含明细追溯和Top1

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 182

【VS Code插件开发】通用功能(二)

本篇主要从command(命令)、menus(菜单)、快捷键三个方面讲解,都归于通用功能。

编码世界 1万+

在VC中动态加载 ODBC的方法

在使用 VC、 VB、 Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置 ODBC数据源。对于一般用户而言,配置 ODBC数据源可能是一件比较困难的工作。而且,在实际应用中,用户往往要求在同一个应用程序中访问不同的数据源,因此采用一般的加载方法就有了无法克服的缺陷。为能在程序中完成这一工作,方便应用程序的使用,本文以 VC为开发环境介绍两种在应用程序中动态加载 ODBC

Johnny的专栏 699

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

动态添加ODBC数据源的两种方法

在使用 VC、 VB、 Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置 ODBC数据源。对于一般用户而言,配置 ODBC数据源可能是一件比较困难的工作。而且,在实际应用中,用户往往要求在同一个应用程序中访问不同的数据源,因此采用一般的加载方法就有了无法克服的缺陷。为能在程序中完成这一工作,方便应用程序的使用,本文以 VC为开发环境介绍两种在应用程序中动态加载 ODBC

qq1134993111的专栏 7495

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

在VC中动态加载ODBC时的一些小细节

Windows系统子目录中的动态链接库Odbcinst.dll提供了一个可以动态地增加、修改和删除数据源的函数SQLConfigDataSource()。该函数的原型如下:BOOL SQLConfigDataSource(HWND hwndParent, WORD fRequest, LPCSTR lpszDriver, LPCSTR lpszAttributes);hwndParent参数是父窗

ljx0305的专栏 840

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: Visual C++ 中的ODBC编程
下一篇: 面向对象技术第一讲 多态性
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值