`
yingyingol
  • 浏览: 742967 次
文章分类
社区版块
存档分类
最新评论

Visual+C+++中的+ODBC+编程

 
阅读更多
摘要:ODBC(Open Database Connectivity,开放式数据库连接),是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的标准应用程序接口(API)。本文给出Windows95环境下用VisualC++进行ODBC编程的具体方法及 技巧。
关键字:ODBC,VisualC++,Windows编程。

一.概述

----ODBC是一种使用SQL的程序设计接口。使用ODBC让应用程序的编写者避免了与数据源相联的复杂性。这项技术目前已经得到了大多数DBMS厂商们的广泛支持。

----Microsoft Developer Studio为大多数标准的数据库格式提供了32位ODBC驱动器。这些标准数据格式包括有:SQL Server、Access、Paradox、dBase、FoxPro、Excel、Oracle以及Microsoft Text。如果用户希望使用其他数据格式,用户需要相应的ODBC驱动器及DBMS。

----用户使用自己的DBMS数据库管理 功能生成新的数据库模式后,就可以使用ODBC来登录数 据源。对用户的应用程序来说,只要安装有驱动程序,就能注册很多不同的数据库。登录数据库的具体操作参见有关ODBC的联机帮助。


二.MFC提供的ODBC数据库类

----VisualC++的MFC基类库定义了几个数据库类。在利用ODBC编程时,经常要使用到CDatabase(数据库类),CRecordSet(记录集类)和CRecordView(可视记录集类)。 其中:

----CDatabase类对象提供了对数据源的连接,通过它你可以对数据源进行操作。

----CRecordSet类对象提供了从数据源 中提取出的记录集。CRecordSet对象通常用于两种形式: 动态行集(dynasets)和快照集(snapshots)。动态行集能保 持与其他用户所做的更改保持同步。快照集则是数据的一个静态视图。每一种形式在记录集被打开时都提供一组记录,所不同的是,当你在一个动态行集里滚 动到一条记录时,由其他用户或是你应用程序中的其他记录集对该记录所做的更改会相应地显示出来。

----CRecordView类对象能以控制的形式 显示数据库记录。这个视图是直接连到一个CRecordSet对象的表视图。


三.应用ODBC编程

----应用VisualC++的AppWizard可以自动生 成一个ODBC应用程序框架。方法是:打开File菜单的New选 项,选取Projects,填入工程名,选择MFCAppWizard(exe),然后按AppWizard 的提示进行操作。当AppWizard询问是否包含数据库支持 时,如果你想读写数据库,那么选定Database view with file support;而如果你想访问数据库的信息而不想回写所做 的改变,那么选定Database view without file support选项就比较合 适了。选择了数据库支持之后Database Source按钮会激活, 选中它去调用Data Options对话框。在Database Options对话框中会 显示已向ODBC注册的数据库资源,选定你所要操作的数据库,如:Super_ES,单击OK后会出现Select Database Tables对话 框,其中列举了你所选中的数据库中包含的全部表,选择你希望操作的表后,单击OK。在选定了数据库和数据表之后,你可以按照惯例继续进行AppWizard操作。

----特别需要指出的是:在生成的应用程序框架View类(如:CSuper_ESView)中包含一个指向CSuper_ESSet 对象的指针m_pSet,该指针由AppWizard建立,目的是在视表单和记录集之间建立联系,使得记录集中的查询结果能够很容易地在视表单上显示出来。有关m_pSet的详细 用法可以参见VisualC++ OnlineBook。

----程序与数据语言建立联系,使 用CDatebase::OpenEx()或CDatabase::Open()函数来进行初始化。数据库 对象必须在你使用它构造一个记录集对象之前被初始化。

----下面举例说明在VisualC++环境中ODBC 的编程技巧:

----1.查询记录
----查询记录使用CRecordSet::Open()和 CRecordSet::Requery()成员函数。在使用CRecordSet类对象之前,必须使用 CRecordSet::Open()函数来获得有效的记录集。一旦已经使用过CRecordSet::Open() 函数,再次查询时就可以应用CRecordSet::Requery()函数。在调 用CRecordSet::Open()函数时,如果已经将一个已经打开的CDatabase 对象指针传给CRecordSet类对象的m_pDatabase成员变量,则使 用该数据库对象建立ODBC连接;否则如果m_pDatabase为空指 针,就新建一个CDatabase类对象并使其与缺省的数据源 相连,然后进行CRecordSet类对象的初始化。缺省数据源 由GetDefaultConnect()函数获得。你也可以提供你所需要的SQL 语句,并以它来调用CRecordSet::Open()函数,例如:

----Super_ESSet.Open(AFX_DATABASE_USE_DEFAULT,strSQL);

----如果没有指定参数,程序则使 用缺省的SQL语句,即对在GetDefaultSQL()函数中指定的SQL语 句进行操作:

CString CSuper_ESSet::GetDefaultSQL()
{return _T("[BasicData],[MainSize]");}
----对于GetDefaultSQL()函数返回的表名, 对应的缺省操作是SELECT语句,即:

----SELECT * FROM BasicData,MainSize

----查询过程中也可以利用CRecordSet的 成员变量m_strFilter和m_strSort来执行条件查询和结果排序。m_strFilter 为过滤字符串,存放着SQL语句中WHERE后的条件串;m_strSort 为排序字符串,存放着SQL语句中ORDERBY后的字符串。 如:

	Super_ESSet.m_strFilter="TYPE='电动机'";
	Super_ESSet.m_strSort="VOLTAGE";
	Super_ESSet.Requery();
	对应的SQL语句为:
	SELECT * FROM BasicData,MainSize 
	WHERE TYPE='电动机'
	ORDER BY VOLTAGE

----除了直接赋值给m_strFilter以外,还 可以使用参数化。利用参数化可以更直观,更方便地 完成条件查询任务。使用参数化的步骤如下:

----(1).声明参变量:

	CStringp1;
	floatp2;

----(2).在构造函数中初始化参变量

	p1=_T("");
	p2=0.0f;
	m_nParams=2;

----(3).将参变量与对应列绑定

	pFX->SetFieldType(CFieldExchange::param)
	RFX_Text(pFX,_T("P1"),p1);
	RFX_Single(pFX,_T("P2"),p2);

----完成以上步骤之后就可以利用 参变量进行条件查询了:

	m_pSet->m_strFilter="TYPE=?ANDVOLTAGE=?";
	m_pSet->p1="电动机";
	m_pSet->p2=60.0;
	m_pSet->Requery();
----参变量的值按绑定的顺序替换 查询字串中的“?”适配符。

----如果查询的结果是多条记录的 话,可以用CRecordSet类的函数Move(),MoveNext(),MovePrev(),MoveFirst() 和MoveLast()来移动光标。

----2.增加记录
----增加记录使用AddNew()函数,要求数据库必须是以允许增加的方式打开:

	m_pSet->AddNew();	//在表的末尾增加新记录
	m_pSet->SetFieldNull(&(m_pSet->m_type),FALSE);	
        m_pSet->m_type="电动机";
		...			//输入新的字段值
	m_pSet->	Update();	//将新记录存入数据库
	m_pSet->Requery();	//重建记录集

----3.删除记录
----直接使用Delete()函数,并且在调用Delete() 函数之后不需调用Update()函数:

	m_pSet->Delete();
	if(!m_pSet->IsEOF())
		m_pSet->MoveNext();
	else
		m_pSet->MoveLast();

----4.修改记录
----修改记录使用Edit()函数:

	m_pSet->Edit();		//修改当前记录
	m_pSet->m_type="发电机";	//修改当前记录字段值
		...
	m_pSet->Update();		//将修改结果存入数据库
	m_pSet->Requery();

----5.撤消操作
----如果用户选择了增加或者修改记录后希望放弃当前操作,可以在调用Update()函数之前调用:

----CRecordSet::Move(AFX_MOVE_REFRESH);

----来撤消增加或修改模式,并恢复在增加或修改模式之前的当前记录。其中的参数AFX_MOVE_REFRESH 的值为零。

----6.数据库连接的复用
----在CRecordSet类中定义了一个成员变 量m_pDatabase:

----CDatabase *m_pDatabase;

----它是指向对象数据库类的指针。如果在CRecordSet类对象调用Open()函数之前,将一个已经打开的CDatabase类对象指针传给m_pDatabase,就能共享相同 的CDatabase类对象。如:

	CDatabase m_db;
	CRecordSet m_set1,m_set2;
	m_db.Open(_T("Super_ES"));	// 建 立ODBC 连 接
	m_set1.m_pDatabase=&m_db;	//m_set1 复 用m_db 对 象
	m_set2.m_pDatabse=&m_db;	// m_set2 复 用m_db 对 象

----7.SQL语句的直接执行
----虽然通过CRecordSet类,我们可以完成 大多数的查询操作,而且在CRecordSet::Open()函数中也可以 提供SQL语句,但是有的时候我们还想进行一些其他操 作,例如建立新表,删除表,建立新的字段等等,这 时就需要使用到CDatabase类的直接执行SQL语句的机制。通 过调用CDatabase::ExecuteSQL()函数来完成SQL语句的直接执行:

	BOOL CDB::ExecuteSQLAndReportFailure(const CString& strSQL)
	{
		TRY
		{
			m_pdb->ExecuteSQL(strSQL);	//直接执行SQL语句
		}
		CATCH (CDBException,e)
		{
			CString strMsg;
			strMsg.LoadString(IDS_EXECUTE_SQL_FAILED);
			strMsg+=strSQL;
			return FALSE;
		}
		END_CATCH 
		return TRUE;
	}

----应当指出的是,由于不同DBMS提 供的数据操作语句不尽相同,直接执行SQL语句可能会 破坏软件的DBMS无关性,因此在应用中应当慎用此类操 作。

----8.动态连接表
----表的动态连接可以利用在调用CRecordSet::Open() 函数时指定SQL语句来实现。同一个记录集对象只能访 问具有相同结构的表,否则查询结果将无法与变量相 对应。

	void CDB::ChangeTable()
	{
		if (m_pSet->IsOpen())	m_pSet->Close();
		switch (m_id)
		{
			case 0:
				m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE, 
				"SELECT * FROM SLOT0");	// 连 接 表SLOT0
				m_id=1;
				break;
			case 1:
				m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE, 
				"SELECT * FROM SLOT1");	// 连 接 表SLOT1
			m_id=0;
			break;
		}
	}

----9.动态连接数据库
----由于与数据库的连接是通过CDatabase 类对象来实现的,所以我们可以通过赋与CRecordSet类对 象参数m_pDatabase以连接不同数据库的CDatabase对象指针,就 可以动态连接数据库。

	void CDB::ChangeConnect()
	{
		CDatabase* pdb=m_pSet->m_pDatabase;
		pdb->Close();
		
		switch (m_id)
		{
		case 0:
			if (!pdb->Open(_T("Super_ES")))	//连接数据源Super_ES
			{
				AfxMessageBox(" 数据源Super_ES打开失败,"
			---- "请检查相应的ODBC连接", MB_OK|MB_ICONWARNING); 
				exit(0);
			}
			m_id=1;
			break;
		case 1:
			if (!pdb->Open(_T("Motor")))	//连接数据源Motor
			{
				AfxMessageBox("数据源Motor打开失败,"
			---- "请检查相应的ODBC连接", MB_OK|MB_ICONWARNING); 
				exit(0);
			}
			m_id=0;
			break;
		}
	}

四.总结

----VisualC++中的ODBC类库可以帮助程 序员完成绝大多数的数据库操作。利用ODBC技术使得程 序员从具体的DBMS中解脱出来,从而极大的减少了软件 开发的工作量,缩短开发周期,提高了效率和软件的 可靠性。本文总结的笔者从事软件开发的一些经验心 得希望对从事ODBC开发的工作者有所帮助。


参考文献

  1. 《VisualC++技术内幕(第二版)》,[美]DavidJ.Kruglinski,清 华大学出版社,1996。
  2. 《VisualC++4.0教程》,Microsoft著,何晓刚等译,科学出版 社等出版,1997。
  3. 《ODBC深入剖析》,[美]KyleGeiger著,曹康等译,电子工 业出版社,1996。

分享到:
评论

相关推荐

    Visual+C++打印编程技术与工程实践

    第1章主要介绍打印编程所需要的基础知识,第2章介绍了打印控制技术,第3章“打印预览”分析了Visual C++框架中的打印预览机制,并介绍了其实现方法,第4章介绍了打印条形码的方法和技巧,第5章介绍了打印信封的方法...

    1.ODBC数据库操作演示(Visual C++编程 源代码)

    1.ODBC数据库操作演示(Visual C++编程 源代码)1.ODBC数据库操作演示(Visual C++编程 源代码)1.ODBC数据库操作演示(Visual C++编程 源代码)1.ODBC数据库操作演示(Visual C++编程 源代码)1.ODBC数据库操作演示...

    Visual+C++精彩实例详解+源代码part1(第1-20章).rar

    第11章 数据库操作--ODBC篇 第12章 数据库操作-DAO篇 第13章 数据库操作-ADO篇 第14章 Excel编程 第15章 拨号上网实例 第16章 FTP协议编程 第17章 Telnet协议编程 第18章 Email协议编程 第19章 基于UDP协议的网段...

    3.如何获取系统已经安装的ODBC驱动程序?(Visual C++编程 源代码)

    (Visual C++编程 源代码)3.如何获取系统已经安装的ODBC驱动程序?(Visual C++编程 源代码)3.如何获取系统已经安装的ODBC驱动程序?(Visual C++编程 源代码)3.如何获取系统已经安装的ODBC驱动程序?(Visual ...

    2.如何使用ODBC创建EXCEL文件?(Visual C++编程 源代码)

    (Visual C++编程 源代码)2.如何使用ODBC创建EXCEL文件?(Visual C++编程 源代码)2.如何使用ODBC创建EXCEL文件?(Visual C++编程 源代码)2.如何使用ODBC创建EXCEL文件?(Visual C++编程 源代码)2.如何使用...

    Visual C++数据库编程快速入门

    Visual C++中的ODBC编程实例 VC6.0中使用ADO操作Access数据库1 VC6.0中使用ADO操作Access数据库2 在Visual C++中用ADO进行数据库编程1 在Visual C++中用ADO进行数据库编程2 在Visual C++中用ADO进行...

    Visual C++中的ODBC编程实例

    区别几种数据库编程,这是其中的一种,后续的等总结以后再发

    Visual C++与Oracle 数据库编程案例

    《Visual C++与Oracle 数据库编程案例》 超级清晰+完整标签 作者: 徐武 / 周启涛 / 葛卉娟 / 徐武 / 葛卉娟 / 周启涛 出版社: 电子工业出版社 出版年: 2004-11-1 页数: 388 本书通过多个具体的案例,详细介绍了...

    Visual C++.NET编程技术体验

    包括该书中所有示例的源程序,所有示例均在Windows XP SP1 + Visual C++.NET环境下调试通过。 内容目录如下: 第2章 定制窗口 2.2 示例——设置窗口风格 2.3.1 示例——创建六边形窗口 2.3.2 示例...

    《Visual C++ .NET实用编程百例》

    《Visual C++ .NET实用编程百例》配套光盘使用指南 在本书配套光盘中可以找到与书中实例相应的文件。文件先按章组成,共分成10章。 每章的文件夹中包含了该章的实例源文件。其中需要使用外部函数的例子将单独占用...

    Visual C++编程技巧精选500例.pdf

    《Visual C++编程技巧精选500例》pdf Visual C++编程技巧精选500例.pdf 第1章 消息框 001 如何创建消息框? 002 如何设置消息框标题? 003 如何使用资源串创建消息框? 004 如何使用资源串动态显示消息框内容? 005 如何...

    (书+++源代码)

    本书以实例详解的方式,循序渐进地介绍了Visual C++ 6.0有关数据库开发的各种技术!本书内容共分3篇和3个附录,由10章组成,第1篇(基础篇)的主要内容有数据库原理与访问、COM与数据库访问、数据库开发过程、VC++...

    例说Visual.C++.6.0

    Visual C++ 6.0是Microsoft公司推出的功能强大的Windows编程语言。本书通过大量的实例,由浅入深、循序渐进地介绍了Visual C++ 6.0的使用方法。首先介绍了Visual C++ 开发环境,然后举了一个常见的例子来说明使用...

    VisualC++技术内幕(第四版)随书盘

    《VisualC++技术内幕(第4版)修订...在前三版的基础上,《VisualC++技术内幕(第4版)修订版》向读者详尽地介绍了Visual C++开发系统和复杂的32位Windows编程技术,全面诠释了Microsoft的这个强大而复杂的开发工具的功能。

    源码+电子书本Visual C++ MFC编程实例

    4.2 在MFC环境中创建一个设备环境 52 4.2.1 屏幕 52 4.2.2 打印机 53 4.2.3 内存 54 4.2.4 信息 54 4.3 绘图例程 55 4.3.1 画点 55 4.3.2 画线 55 4.3.3 画形状 55 4.3.4 形状填充和翻转 55 4.3.5 滚动 56 4.3.6 ...

    Visual C++技术内幕

    本书从对Windows,Visual C++ 和应用程序框架的技术性概述入手,讨论了下列课题: 基础知识:事件处理,GDI,对话框,内存管理,SDI和MDI,打印,以及帮助 高级课题:多线程,DIB,ODBC,DLL ActiveX:创建文档对象...

    Visual C++中的ODBC编程技术

    Microsoft公司推出的Visual C++,是面向对象的应用开发环境。最重要的特征是提供了MFC类库,封装了Windows API接口函数,并建立了应用程序框架,使程序开发人员可将主要精力集中在所要解决的具体问题上。主要介绍...

    Visual C++ 编程资源大全(英文源码 数据库)

    BdeDatabase.zip Accessing the Borland Database Engine (BDE) from Visual C++(224KB)<END><br>27,AsyncRecordset_src.zip Two classes that provide support for asynchronous SQL execution. (7KB)<END>...

Global site tag (gtag.js) - Google Analytics