ODBC(Open Database Conectivity开放式数据库互联),其工作依赖于数据库制造商提供的驱动程序.
使用ODBC API的时候,首先要配置数据源.
Windows的ODBC管理程序,把数据库访问的请求传递给正确的驱动程序,驱动程序再使用SQL语句指示DBMS(数据库管理系统)完成数据库访问工作。
一般,数据库到ODBC驱动程序管理器的注册(创建ODBC数据源),有下面两种方法:
一是编程时手工配置ODBC数据源(在系统控制面板找到ODBC程序设置),发布时使用InstallShield等安装制作软件自动配置ODBC数据源;
二是考虑用程序替用户完成这些配置工作,实现的方法有几种,一种办法是用程序修改Windows注册表,用Windows API函数增改HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI中的键值,这种方法比较烦琐,另一种是在程序中使用ODBC API的方法,我们可以在任何时候都可以用Visual C++编写的程序调用这些API函数来设置ODBC数据源。
创建ODBC数据源可以调用函数SQLConfigDataSource()实现, 函数定义在动态链接库ODBCCP32.DLL中,该函数可以动态地增加、修改和删除数据源。
SQLConfigDataSource()原型:
BOOL SQLConfigDataSource(HWND hwndParent,
UINT fRequest,
LPCSTR IpszDriver,
LPCSTR IpszAttributes);
其中四个参数的用法如下:
●参数hwndPwent是父级窗口句柄。如果句柄为NULL,将不会显示一些有关的对话框。(参数 IpszAttributes提供的信息不够完善,在创建过程中就会出现对话框要求用户提供相应信息。)
●参数fRequest可以设置为下面的数值之一:
ODBC_ADD_DSN: 增加_个新数据源
ODBC_CONHG_DSN: 配置(修改)一个已经存在的数据源
ODBC_REMOVE_DSN: 删除一个已经存在的数据源
ODBC_ADD_SYS_DSN: 增加一个新的系统数据源
ODBC_CONFIG_SYS_DSN: 更改一个已经存在的系统数据源
ODBC_REMOVE_SYS_DSN: 删除一个已经存在的系统数据源
●参数lpszDriver是数据库引擎名称,可以参见ODBC管理器中对ODBC驱动程序的描述。比如要加载的是Excel数据库,那么数据库引擎名称就为Microsoft Excel Driver(*.xls)
mdb数据库引擎名称为Microsoft Access Driver(*.mdb)
动态创建
●参数lpszAttributes为一连串的"KeyName=value"字符串,每两个KeyName值之间用\0""字符隔开(或者\0隔开即可)。
KeyName主要是新数据源缺省的驱动程序注册说明,
其中最主要的关键字是"DSN"(新数据源的名称)和"DBQ"(数据源的地址),
其余关键字则根据不同的数据源有不同要求。关于lpszAttributes参数的具体设置,可以MSDN手册查阅ConfigDSN,获取更多介绍
具体可参阅例程关键代码。例程中文件test.mdb为手工创建
使用SqlConfigDataSource函数之前,须包含头文件
#include <afxdb.h>//数据库支持头文件
#include <odbcinst.h>//SQLConfigDataSource()函数头文件
关键代码为:
- void CMy123View::OnButton1()
- {
- if(m_pRecordSet)
- return;
- char cPath[MAX_PATH]="";
- GetModuleFileName(NULL,cPath,MAX_PATH);
- CString sAttri(cPath);
- sAttri = sAttri.Left(sAttri.ReverseFind('\\'));
- strcpy(cPath,sAttri);
- sAttri.Format("DBQ=%s\\test.mdb|",cPath);
- strcpy(cPath,"DSN=Students|");
- strcat(cPath,sAttri);
- strcat(cPath,"Description=工控编程吧gkbc8.com测试用");
- int len = strlen(cPath);
- for(int i=0;i<len;i++)
- {
- if(cPath[i] == '|')
- cPath[i]='\0';
- }
- if(!SQLConfigDataSource(NULL, ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)",cPath ) )
- {
- AfxMessageBox("创建数据源失败!!");
- return;
- }
- if(!m_Database.OpenEx("DSN=Students",0) )
- {
- AfxMessageBox("打开数据源失败!!");
- return;
- }
- TRY
- {
- m_Database.ExecuteSQL("CREATE TABLE VIPList (ID INTEGER,Name VARCHAR(10),PhoneNO INTEGER)");
- }
- CATCH(CDBException, e)
- {
- AfxMessageBox("创建数据表失败!!");
- return;
- }
- END_CATCH
- m_pRecordSet = new CRecordset(&m_Database);
- }
复制代码
MFC上数据库有四种编程方法,下面引用 网络段落:
ODBC(Open Database Connectivity,开放数据库互连) 1992年,微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。---出现的最早,但不总是万能。
DAO(Data Access Object,数据访问对象) 1993年,微软公司用来显露了Microsoft Jet数据库引擎(最早是给Microsoft Access 所使用,现在已经支持其它数据库),并允许开发者通过ODBC直接连接到其他数据库一样,直接连接到 Access 表。DAO 最适用于单系统应用程序或在小范围本地分布使用。其内部已经对Jet数据库的访问进行了加速优化,而且其使用起来也是很方便的。所以如果数据库是Access数据库且是本地使用的话,建议使用这种访问方式---应用的专一性
RDO(Remote Data Objects,远程数据对象) 1995年,RDO是一个到ODBC的、面向对象的数据访问接口,它同易于使用的DAO style组合在一起,提供了一个接口,形式上展示出所有ODBC的底层功能和灵活性。尽管RDO在很好地访问Jet或ISAM数据库方面受到限制,而且它只能通过现存的ODBC驱动程序来访问关系数据库。但是,RDO已被证明是许多SQL Server、Oracle 以及其他大型关系数据库开发者经常选用的最佳接口。RDO提供了用来访问存储过程和复杂结果集的更多和更复杂的对象、属性,以及方法。---无疑是在odbc基础上的
OLE DB(Object Linking and Embedding, Database,对象连接嵌入数据库) 1997年, Microsoft 的一个战略性系统级编程接口,用于管理整个组织内的数据。OLE DB 是建立在 ODBC 功能之上的一个开放规范。ODBC 是为访问关系型数据库而专门开发的,OLE DB 则用于访问关系型和非关系型信息源,例如主机 ISAM/VSAM 和层次数据库,电子邮件和文件系统存储,文本、图形和地理数据以及自定义业务对象。 OLE DB 定义了一组 COM 接口,对各种数据库管理系统服务进行封装,并允许创建软件组件,实现这些服务。OLE DB 组件包括数据提供程序(包含和表现数据)、数据使用者(使用数据)和服务组件(处理和传送数据,例如,查询处理器和游标引擎)。
OLE DB 接口有助于平滑地集成组件,这样,OLE DB 组件厂商就可以快速地向市场提供高质量 OLE DB 组件。此外,OLE DB 包含了一个连接 ODBC 的“桥梁”,对现用的各种 ODBC 关系型数据库驱动程序提供一贯的支持。---号称取代odbc,但也兼容odbc
ADO(ActiveX Data Object,活动数据对象) 1996年,ADO是DAO/RDO的后继产物。ADO 2.0在功能上与RDO更相似,而且一般来说,在这两种模型之间有一种相似的映射关系。ADO"扩展"了DAO和 RDO 所使用的对象模型,这意味着它包含较少的对象、更多的属性、方法(和参数),以及事件。 作为最新的数据库访问模式,ADO的使用也是简单易用,所以微软已经明确表示今后把重点放在ADO上,对DAO/RDO不再作升级,所以ADO已经成为了当前数据库开发的主流。 ADO涉及的数据存储有DSN(数据源名称)、ODBC(开放式数据连接)以及OLE DB三种方式。
例程代码中附上<ADO编程技术>
百度云附件:上位机程序动态创建ODBC数据源.rar
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|