`
阿尔萨斯
  • 浏览: 4110388 次
社区版块
存档分类
最新评论

Visual C++ 中的ODBC编程

 
阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>

原地址:http://www.yesky.com/20000130/27583.shtml
ODBC(Open Database Connectivity,开放式数据库连接),是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的标准应用程序接口(API)。本文给出Windows 95 环境下用Visual C++ 进行ODBC 编程的具体方法及技巧。

---- 关键字:ODBC,Visual C++,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 数据库类

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

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

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

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

---- 三.应用ODBC 编程

---- 应用Visual C++ 的AppWizard 可以自动生成一个ODBC 应用程序框架。方法是:打开File 菜单的New 选项,选取Projects,填入工程名,选择MFC AppWizard (exe),然后按AppWizard 的提示进行操作。当AppWizard 询问是否包含数据库支持时,如果你想读写数据库,那么选定Database view with file support;而 《―atabase 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 的详细用法可以参见Visual C++ Online Book。

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

---- 下面举例说明在Visual C++ 环境中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 语句中ORDER BY 后的字符串。如:

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) .声明参变量:

CString p1;
float p2;
---- (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=? AND VOLTAGE=?";
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;
}
}
---- 四.总结

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





分享到:
评论

相关推荐

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

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

    Visual C++中的ODBC编程实例

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

    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进行...

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

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

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

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

    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++中的ODBC编程技术

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

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

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

    VISUAL C++MFC扩展编程实例

    本书主要介绍了运用Visual C++ 5.0或6.0的高级编程技巧,内容涉及MFC程序设计的最新概念,全书提供了大量VC的编程实例,旨在帮助读者较为全面地掌握VC编程知识、技巧和方法。全书分为三个部分和附录。第一部分介绍...

    Visual Sudio2019利用ODBC连接SQL server数据库

    本项目基于Visual Sudio2019和SQL server数据库的一个数据库项目

    visual c++ 6.0 数据库编程大全

    本书采用visual c++6.0环境,并对其深入分析以便了解如何编写高级visual c++数据库应用程序。介绍visual c++数据库、ODBC程序设计、OLE DB程序设计等

    Visual C++ MFC扩展编程实例.PDF

    本书主要介绍了运用Visual C++ 5.0或6.0的高级编程技巧,内容涉及MFC程序设计的最新概念,全书提供了大量VC的编程实例,旨在帮助读者较为全面地掌握VC编程知识、技巧和方法。全书分为三个部分和附录。第一部分介绍...

    VISUAL C++MFC编程实例

    本书通过85个实例全面讲述了应用MFC进行Visual C++编程的思想。每个实例均以编写一个应用程序要走的步骤编写。全书共分四部分进行介绍,第一部分是基础知识,第二部分讲述用户界面的实例,第三部分讲述MFC内部处理...

    Visual C++ 6.0 数据库编程大全

    Visual C++ 6.0 数据库编程大全 文件格式 pdf odbc 程序设计; ole db 程序设计;特殊数据库论题

    源码+电子书本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++ 数据库编程三部教学

    本书以实用为目的,结合具体的数据库应用,选择了7个最有代表性的实例,分别介绍ODBC API、MFC的ODBC类、DAO、OLE DB以及ADO的客户数据库访问技术和应用开发过程。本书还通过ADO数据库组件开发实例和OLE DB服务器...

Global site tag (gtag.js) - Google Analytics