2 系统开发技术的分析
系统客户端界面采用Visual C++ 6.0,后台数据库使用SQL SERVER 2000作为数据库服务器,下面将对前台开发工具Visual C++ 6.0,后台数据库Microsoft SQL Server 2000等相关技术进行详细分析。
2.1前台开发工具Visual C++ 6.0
Visual C++6.0是Microsoft公司的Developer Studio 6.0工具集的重要组成部分,是一种用于开发Windows应用程序的可视化开发工具。它改善了传统的编程手段,使得程序员可以直接在用户界面良好的可视化开发环境中进行工作。Visual C++6.0还集成了多种有用的工具与功能,从而大大提高了应用程序的开发效率。作为数据库开发的前台工具或开发环境有许多,用的比较多的有
Delphi,Visual Basic 和PB(PowerBuilder)等。对于Visual C++来说,从VC++ 4.0开始就对数据库开发提供了比较好的开发环境;在VC++ 6中,对数据库的访问技术更成熟,功能更加强大。借助于VC++可以轻松地开发出功能强,速度快,应用广并且占用资源少的应用程序。
另外,Visual C++提供了多种多样的数据库访问技术:ODBC API,MFC ODBC,DAO,OLE DB,ADO等。这些技术各有自己的特点,它们提供了简单,灵活,访问速度快,可扩展好的开发技术。同时,这也是与其他技术相比VC++开发的优势所在。
1.简单性
由于Visual C++中提供了MFC类,模块类以及AppWizard和ClassWizard等一系列“向导”用于产生应用程序这一点简化应用程序的开发。如果借助于某些控件,开发这甚至可以无需编写代码就可以产生一个完整的数据库应用。
2.灵活性
Visaul C++提供的 开发环境可以使开发者根据自己的需要设计应用程序的界面和功能,而且,Visual C++停供了丰富的类库和方法,可以使开发者根据自己的应用特点进行选择。
3.访问速度快
为了解决ODBC开发的数据库应用程序访问数据库德速度慢的问题,Visual C++提供了新的访问技术:OLE DB和ADO,OLE DB和ADO都是基于COM接口的技术,使用这种技术可以直接对数据库德驱动程序进行访问,这大大提高了访问速度。
4.可扩展性
Visual C++提供了OLE技术和ActiveX技术,这种技术可以增强应用程序的能力。使用OLE技术和ActiveX技术可以使开发者利用Visual C++中提供的各种组件,控件以及第三方开发者提供的组件来创建自己的程序,从而实现应用程序的组件化。使用这种技术可以使应用程序具有良好的可扩展性。
5.访问不同种类数据源
传统的ODBC技术只能访问关系数据库,在Visual C++中,提供了OLE DB访问技术,不仅可以访问关系型数据库,还可以访问非关系型数据库。
2.2 数据库开发工具 Microsoft SQL Server 2000简介
SQL Server 是一个关系数据库管理系统它最初是由Microsoft Sybase 和Ashton-Tate三家公司共同开发的于1988 年推出了第一个OS/2 版本在Windows NT 推出后Microsoft与Sybase 在SQL Server 的开发上就分道扬镳了Microsoft 将SQL Server 移植到Windows NT系统上专注于开发推广SQL Server 的Windows NT 版本Sybase 则较专注于SQL Server在UNIX 操作系统上的应用在本书中介绍的是Microsoft SQL Server 以后简称为SQL Server或MS SQL Server 。
SQL Server 2000 是Microsoft 公司推出的SQL Server 数据库管理系统的最新版本该版本继承了SQL Server 7.0 版本的优点同时又比它增加了许多更先进的功能具有使用方便可伸缩性好与相关软件集成程度高等优点可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2000 的大型多处理器的服务器等多种平台使用 。
SQL Server本身是一个很好的应用程序开发环境,它有和VB类似的界面设计方法,一样易学易用。在面向数据库的应用程序开发方面比起VB的开发效率更高,功能更强。它提供了很多对象(表,窗体,查询,报表)的设计向导,使得有VB基础的非常容易使用。SQL Server拥有的子窗体、子报表控件,它在设计表结构的界面和报表方面给程序员带来巨大的方便。
SQL Server软件所能完成的功能基本上是一个数据库管理系统所就具有的功能:
1.可以根据需要定制SQL Server数据库系统,对数据进行保存、查阅和计算。
2.利用表存储相应的数据信息,为每一种实际对象的信息创建一个表,在表中对不同数据以不同的方式进行保存。
3.可以按照实际中对象之间的关系,定义各个表之间的关系,将各个表中相关的数据有机地联系在一起。
4.可以检索用户指定条件的数据,创建相应的查询来进行检索,也可以利用查询来更新或删除多条记录,并对表中的数据执行各种计算。
5.可以直接输入、查看或更改数据库中的数据,利用表格或创建一定的窗体来完成上述功能。
6.可以对数据库中的数据进行分析,或者通过特定的方式将数据打印出来,绘制一份相应要求的报表。
7.可以将数据库中的数据传输到其他数据库的服务器上,实现资源共享,通过Web页功能来制作数据访问页。
SQL Server2000软件所具有的特点:
1.多个SQL Server 实例
SQL Server 2000 支持在同一计算机上同时运行多个关系数据库实例每个实例有其独立的系统和用户数据库集合应用程序采用与连接不同计算机上的SQL Server 实例大致相同的方式连接同一计算机上的各个实例。
2.Failover 群集Clustering 增强
对Failover 群集的管理有了较大的改善可以方便地安装配置管理一个SQL Server 2000 Failover 群集。
3.网络库Net-Library 增强
简化了客户机配置并支持同一计算机上的多实例连接。
4.Kerberos 和安全授权Security Delegation
SQL Server 2000 使用Kerberos 来支持客户机和服务器之间相互的身份验证使用Kerberos 和授权来支持复合认证以及SQL Server 注册。
5.备份和恢复Backup and Restore 增强
SQL Server 2000 引入了一个更容易理解的模型来指定备份和恢复的选项同时还支持使用事务日志标识来恢复工作到指定点或进行数据库的部分恢复。
6.对公用操作的可伸缩性Scalability 增强
增强的公用操作包括快速差异备份并行的数据库一致性校验和并行扫描。
2.3 VisualC++提供的几种主要数据库访问技术
下面来简单比较一下Visual C++提供的几种主要数据库访问技术。
(1)ODBC和MFC ODBC
ODBC是为客户应用程序访问关系数据库时提供的一个标准接口,对不同的数据库,ODBC提供了一套统一的API,使得应用程序可以应用所提供的API,访问任何提供ODBC驱动程序的数据库。而且,由于ODBC已经成为一种标准,所以现在几乎所有的关系数据库都提供了ODBC的驱动程序,从而使得ODBC应用更加广泛。
ODBC API可以进行一些底层的数据库操作,但代码编制相对来说比较复杂;向.MFC ODBC是Visual C++对ODBC API封装得到的,因此可以简化程序设计,但缺点也是不言而喻的,那就是无法财数据源进行底层操作。
(2)DAO
DAO提供了一种通过程序代码创建和操纵数据库的机制。多个DAO构成一个体系结构。在这个结构中,各个DAO对象协同工作。MFC DAO是微软公司提供的用于访问Microsoft Jet数据库文件(*.mdb)的强有力的数据库开发上具,它通过DAO的封装,向程序员提供了DAO丰富的操作数据库的手段。
(3)OLE DB和ADO
OLE DB是Visual C++开发数据库应用中提供的基于COM接口的新技术,因此OLE DB对所有的文件系统(包括关系数据库和非关系数据库)都提供了统一的接口。这些特性使得OLE DB技术比传统的数据库访问技术更加优越。
直接使用OLE DB来设计数据库应用程序需要大量的代码。在VC中提供了ATL模板,用于设计OLE DB数据应用程序和数据提供程序。它是一种底层接口。而ADO技术则是基于OLE DB的访问接口,对OLE DB的接口作了封装,定义了ADO对象,使得程序开发得到简化,它属于数据库访问的高层接口。
2.4 ADO技术介绍
ADO是目前在Windows环境中比较流行的客户端数据库编程技术。ADO是建立在OLE DB底层技术之上的高级编程接口,因而它兼具有强大的数据处理功能(处理各种不同类型的数据源、分布式的数据处理等等)和极其简单、易用的编程接口,因而得到了广泛的应用。
(1)在VC++中使用ADO编程
ADO实际上就是由一组Automation对象构成的组件,因此可以像使用其它任何Automation对象一样使用ADO。ADO中最重要的对象有三个:Connection、
Command和Recordset,它们分别表示连接对象、命令对象和记录集对象。使用ADO编程时可以采用以下方法:
#import "C:\Program Files\Common
\no_namespace rename("EOF", "EndOfFile") Files\System\ADO\msado15.dll"
程序在编译过程中,VC++会读出msado15.dll中的类型库信息,自动产生两个该类型库的头文件和实现文件msado15.tlh和msado15.tli(在Debug或Release目录下)。在这两个文件里定义了ADO的所有对象和方法,以及一些枚举型的常量等。这与使用MFC中的COleDispatchDriver类调用Automation对象十分类似。
ADO编程的关键,就是熟练地运用ADO提供的各种对象(object)、方法(method)、属性(property)和容器(collection)。如果是在MS SQL或Oracle等大型数据库上编程,还要能熟练使用SQL语言。
(2)使用#import方法的编程步骤
1.添加#import指令
打开stdafx.h文件,将下列内容添加到所有的include指令之后:
#include //Include support for VC++ Extensions
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \no_namespace rename("EOF", "adoEOF")
其中icrsint.h文件包含了VC++扩展的一些预处理指令、宏等的定义,用于COM编程时使用。
2.定义_ConnectionPtr型变量,并建立数据库连接
建立了与数据库服务器的连接后,才能进行其他有关数据库的访问和操作。ADO使用Connection对象来建立与数据库服务器的连接,所以它相当于MFC中的CDatabase类。和CDatabase类一样,调用Connection对象的Open方法即可建立与服务器的连接。
数据类型 _ConnectionPtr实际上就是由类模板_com_ptr_t而得到的一个具体的实例类,其定义可以到msado15.tlh、comdef.h 和comip.h这三个文件中找到。在msado15.tlh中有:
_COM_SMARTPTR_TYPEDEF(_Collection, __uuidof(_Collection));
经扩展后就得到了_ConnectionPtr类。_ConnectionPtr类封装了Connection对象的Idispatch接口指针,及一些必要的操作。我们就是通过这个指针来操纵Connection对象。类似地,后面用到的_CommandPtr和_RecordsetPtr类型也是这样得到的,它们分别表示命令对象指针和记录集对象的指针。
3.定义_RecordsetPtr型变量,并打开数据集
定义_RecordsetPtr型变量,然后通过它调用Recordset对象的Open方法,即可打开一个数据集。所以Recordset对象与MFC中的CRecordset类类似,它也有当前记录、当前记录指针的概念。如:
_RecordsetPtr m_pRecordset;
if(!FAILED(m_pRecordset.CreateInstance( __uuidof( Recordset )))
{
m_pDoc->m_initialized=FALSE;
return;
}
try
{
m_pRecordset->Open(_variant_t("mytable"), _variant_t((IDispatch *)pMyConnect,true), adOpenKeyset, adLockOptimistic, adCmdTable);
}
catch (_com_error &e)
{
::MessageBox(NULL,"无法打开mytable表。","提示", MB_OK | MB_ICONWARNING);
}
Recordset对象的Open方法非常重要,它的第一个参数可以是一个SQL语句、一个表的名字或一个命令对象等等;第二个参数就是前面建立的连接对象的指针。此外,用Connection和Command对象的Execute方法也能得到记录集,但是只读的。
4.读取当前记录的数据
最方便的方法如下:
try
{
m_pRecordset->MoveFirst();
while(m_pRecordset->adoEOF==VARIANT_FALSE)
{
//Retrieve column's value:
CString sName=(char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("name"))->Value);
short cAge=(short)(m_pRecordset->Fields->GetItem(_variant_t("age"))->Value); //Do something what you want to do:
......
m_pRecordset->MoveNext();
}
}//try
catch (_com_error &e)
{
CString str=(char*)e.Description();
::MessageBox(NULL,str+"\n又出毛病了。","提示", MB_OK | MB_ICONWARNING); }
其中的name和age都是字段名,读取的字段值分别保存在sName和cAge变量内。例中的Fields是Recordset对象的容器,GetItem方法返回的是Field对象,而Value则是Field对象的一个属性(即该字段的值)。通过此例,应掌握操纵对象属性的方法。例如,要获得Field 对象的Value属性的值可以直接用属性名Value来引用它(如上例),但也可以调用Get方法,例如:
CString
sName=(char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("name"))->GetValue());
还可以看到,判断是否到达记录集的末尾,使用记录集的adoEOF属性,其值若为真即到了结尾,反之则未到。判断是否到达记录集开头,则可用BOF属性。
另外,读取数据还有一个方法,就是定义一个绑定的类,然后通过绑定的变量得到字段值。
5.修改数据
try
{
m_pRecordset->MoveFirst();
while(m_pRecordset->adoEOF==VARIANT_FALSE)
{
m_pRecordset->Fields->GetItem(_variant_t("姓名"))->Value=_bstr_t("赵薇");
......
m_pRecordset->Update();
m_pRecordset->MoveNext();
}
}//try改变了Value属性的值,即改变了字段的值。
6.添加记录
新记录添加成功后,即自动成为当前记录。AddNew方法有两种形式,一个含有参数,而另一个则不带参数。
// Add new record into this table:
try
{
if(!m_pRecordset->Supports(adAddNew)) return;
m_pRecordset->AddNew();
m_pRecordset->Fields->GetItem(_variant_t("姓名"))->Value=_bstr_t("赵薇");
m_pRecordset->Fields->GetItem(_variant_t("性别"))->Value=_bstr_t("女");
m_pRecordset->Fields->GetItem(_variant_t("age"))->Value=_variant_t((short)20); m_pRecordset->Fields->GetItem(_variant_t("marry"))->Value=_bstr_t("未婚");
m_pRecordset->Update();
}//try
catch (_com_error &e)
{
::MessageBox(NULL, "又出毛病了。","提示",MB_OK | MB_ICONWARNING); }
7.删除记录
调用Recordset的Delete方法就行了,删除的是当前记录。要了解Delete的其它用法请查阅参考文献。
try
{
m_pRecordset->MoveFirst();
while(m_pRecordset->adoEOF==VARIANT_FALSE)
{
CString sName=(char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("姓名"))->Value);
if(::MessageBox(NULL,"姓名="+sName+"\n删除她吗?", "提示",MB_YESNO | MB_ICONWARNING)==IDYES)
{
m_pRecordset->Delete(adAffectCurrent);
m_pRecordset->Update();
}
m_pRecordset->MoveNext();
}
}//try
catch (_com_error &e)
{
::MessageBox(NULL,"又出毛病了。","提示",MB_OK | MB_ICONWARNING); }
2 系统开发技术的分析
系统客户端界面采用Visual C++ 6.0,后台数据库使用SQL SERVER 2000作为数据库服务器,下面将对前台开发工具Visual C++ 6.0,后台数据库Microsoft SQL Server 2000等相关技术进行详细分析。
2.1前台开发工具Visual C++ 6.0
Visual C++6.0是Microsoft公司的Developer Studio 6.0工具集的重要组成部分,是一种用于开发Windows应用程序的可视化开发工具。它改善了传统的编程手段,使得程序员可以直接在用户界面良好的可视化开发环境中进行工作。Visual C++6.0还集成了多种有用的工具与功能,从而大大提高了应用程序的开发效率。作为数据库开发的前台工具或开发环境有许多,用的比较多的有
Delphi,Visual Basic 和PB(PowerBuilder)等。对于Visual C++来说,从VC++ 4.0开始就对数据库开发提供了比较好的开发环境;在VC++ 6中,对数据库的访问技术更成熟,功能更加强大。借助于VC++可以轻松地开发出功能强,速度快,应用广并且占用资源少的应用程序。
另外,Visual C++提供了多种多样的数据库访问技术:ODBC API,MFC ODBC,DAO,OLE DB,ADO等。这些技术各有自己的特点,它们提供了简单,灵活,访问速度快,可扩展好的开发技术。同时,这也是与其他技术相比VC++开发的优势所在。
1.简单性
由于Visual C++中提供了MFC类,模块类以及AppWizard和ClassWizard等一系列“向导”用于产生应用程序这一点简化应用程序的开发。如果借助于某些控件,开发这甚至可以无需编写代码就可以产生一个完整的数据库应用。
2.灵活性
Visaul C++提供的 开发环境可以使开发者根据自己的需要设计应用程序的界面和功能,而且,Visual C++停供了丰富的类库和方法,可以使开发者根据自己的应用特点进行选择。
3.访问速度快
为了解决ODBC开发的数据库应用程序访问数据库德速度慢的问题,Visual C++提供了新的访问技术:OLE DB和ADO,OLE DB和ADO都是基于COM接口的技术,使用这种技术可以直接对数据库德驱动程序进行访问,这大大提高了访问速度。
4.可扩展性
Visual C++提供了OLE技术和ActiveX技术,这种技术可以增强应用程序的能力。使用OLE技术和ActiveX技术可以使开发者利用Visual C++中提供的各种组件,控件以及第三方开发者提供的组件来创建自己的程序,从而实现应用程序的组件化。使用这种技术可以使应用程序具有良好的可扩展性。
5.访问不同种类数据源
传统的ODBC技术只能访问关系数据库,在Visual C++中,提供了OLE DB访问技术,不仅可以访问关系型数据库,还可以访问非关系型数据库。
2.2 数据库开发工具 Microsoft SQL Server 2000简介
SQL Server 是一个关系数据库管理系统它最初是由Microsoft Sybase 和Ashton-Tate三家公司共同开发的于1988 年推出了第一个OS/2 版本在Windows NT 推出后Microsoft与Sybase 在SQL Server 的开发上就分道扬镳了Microsoft 将SQL Server 移植到Windows NT系统上专注于开发推广SQL Server 的Windows NT 版本Sybase 则较专注于SQL Server在UNIX 操作系统上的应用在本书中介绍的是Microsoft SQL Server 以后简称为SQL Server或MS SQL Server 。
SQL Server 2000 是Microsoft 公司推出的SQL Server 数据库管理系统的最新版本该版本继承了SQL Server 7.0 版本的优点同时又比它增加了许多更先进的功能具有使用方便可伸缩性好与相关软件集成程度高等优点可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2000 的大型多处理器的服务器等多种平台使用 。
SQL Server本身是一个很好的应用程序开发环境,它有和VB类似的界面设计方法,一样易学易用。在面向数据库的应用程序开发方面比起VB的开发效率更高,功能更强。它提供了很多对象(表,窗体,查询,报表)的设计向导,使得有VB基础的非常容易使用。SQL Server拥有的子窗体、子报表控件,它在设计表结构的界面和报表方面给程序员带来巨大的方便。
SQL Server软件所能完成的功能基本上是一个数据库管理系统所就具有的功能:
1.可以根据需要定制SQL Server数据库系统,对数据进行保存、查阅和计算。
2.利用表存储相应的数据信息,为每一种实际对象的信息创建一个表,在表中对不同数据以不同的方式进行保存。
3.可以按照实际中对象之间的关系,定义各个表之间的关系,将各个表中相关的数据有机地联系在一起。
4.可以检索用户指定条件的数据,创建相应的查询来进行检索,也可以利用查询来更新或删除多条记录,并对表中的数据执行各种计算。
5.可以直接输入、查看或更改数据库中的数据,利用表格或创建一定的窗体来完成上述功能。
6.可以对数据库中的数据进行分析,或者通过特定的方式将数据打印出来,绘制一份相应要求的报表。
7.可以将数据库中的数据传输到其他数据库的服务器上,实现资源共享,通过Web页功能来制作数据访问页。
SQL Server2000软件所具有的特点:
1.多个SQL Server 实例
SQL Server 2000 支持在同一计算机上同时运行多个关系数据库实例每个实例有其独立的系统和用户数据库集合应用程序采用与连接不同计算机上的SQL Server 实例大致相同的方式连接同一计算机上的各个实例。
2.Failover 群集Clustering 增强
对Failover 群集的管理有了较大的改善可以方便地安装配置管理一个SQL Server 2000 Failover 群集。
3.网络库Net-Library 增强
简化了客户机配置并支持同一计算机上的多实例连接。
4.Kerberos 和安全授权Security Delegation
SQL Server 2000 使用Kerberos 来支持客户机和服务器之间相互的身份验证使用Kerberos 和授权来支持复合认证以及SQL Server 注册。
5.备份和恢复Backup and Restore 增强
SQL Server 2000 引入了一个更容易理解的模型来指定备份和恢复的选项同时还支持使用事务日志标识来恢复工作到指定点或进行数据库的部分恢复。
6.对公用操作的可伸缩性Scalability 增强
增强的公用操作包括快速差异备份并行的数据库一致性校验和并行扫描。
2.3 VisualC++提供的几种主要数据库访问技术
下面来简单比较一下Visual C++提供的几种主要数据库访问技术。
(1)ODBC和MFC ODBC
ODBC是为客户应用程序访问关系数据库时提供的一个标准接口,对不同的数据库,ODBC提供了一套统一的API,使得应用程序可以应用所提供的API,访问任何提供ODBC驱动程序的数据库。而且,由于ODBC已经成为一种标准,所以现在几乎所有的关系数据库都提供了ODBC的驱动程序,从而使得ODBC应用更加广泛。
ODBC API可以进行一些底层的数据库操作,但代码编制相对来说比较复杂;向.MFC ODBC是Visual C++对ODBC API封装得到的,因此可以简化程序设计,但缺点也是不言而喻的,那就是无法财数据源进行底层操作。
(2)DAO
DAO提供了一种通过程序代码创建和操纵数据库的机制。多个DAO构成一个体系结构。在这个结构中,各个DAO对象协同工作。MFC DAO是微软公司提供的用于访问Microsoft Jet数据库文件(*.mdb)的强有力的数据库开发上具,它通过DAO的封装,向程序员提供了DAO丰富的操作数据库的手段。
(3)OLE DB和ADO
OLE DB是Visual C++开发数据库应用中提供的基于COM接口的新技术,因此OLE DB对所有的文件系统(包括关系数据库和非关系数据库)都提供了统一的接口。这些特性使得OLE DB技术比传统的数据库访问技术更加优越。
直接使用OLE DB来设计数据库应用程序需要大量的代码。在VC中提供了ATL模板,用于设计OLE DB数据应用程序和数据提供程序。它是一种底层接口。而ADO技术则是基于OLE DB的访问接口,对OLE DB的接口作了封装,定义了ADO对象,使得程序开发得到简化,它属于数据库访问的高层接口。
2.4 ADO技术介绍
ADO是目前在Windows环境中比较流行的客户端数据库编程技术。ADO是建立在OLE DB底层技术之上的高级编程接口,因而它兼具有强大的数据处理功能(处理各种不同类型的数据源、分布式的数据处理等等)和极其简单、易用的编程接口,因而得到了广泛的应用。
(1)在VC++中使用ADO编程
ADO实际上就是由一组Automation对象构成的组件,因此可以像使用其它任何Automation对象一样使用ADO。ADO中最重要的对象有三个:Connection、
Command和Recordset,它们分别表示连接对象、命令对象和记录集对象。使用ADO编程时可以采用以下方法:
#import "C:\Program Files\Common
\no_namespace rename("EOF", "EndOfFile") Files\System\ADO\msado15.dll"
程序在编译过程中,VC++会读出msado15.dll中的类型库信息,自动产生两个该类型库的头文件和实现文件msado15.tlh和msado15.tli(在Debug或Release目录下)。在这两个文件里定义了ADO的所有对象和方法,以及一些枚举型的常量等。这与使用MFC中的COleDispatchDriver类调用Automation对象十分类似。
ADO编程的关键,就是熟练地运用ADO提供的各种对象(object)、方法(method)、属性(property)和容器(collection)。如果是在MS SQL或Oracle等大型数据库上编程,还要能熟练使用SQL语言。
(2)使用#import方法的编程步骤
1.添加#import指令
打开stdafx.h文件,将下列内容添加到所有的include指令之后:
#include //Include support for VC++ Extensions
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \no_namespace rename("EOF", "adoEOF")
其中icrsint.h文件包含了VC++扩展的一些预处理指令、宏等的定义,用于COM编程时使用。
2.定义_ConnectionPtr型变量,并建立数据库连接
建立了与数据库服务器的连接后,才能进行其他有关数据库的访问和操作。ADO使用Connection对象来建立与数据库服务器的连接,所以它相当于MFC中的CDatabase类。和CDatabase类一样,调用Connection对象的Open方法即可建立与服务器的连接。
数据类型 _ConnectionPtr实际上就是由类模板_com_ptr_t而得到的一个具体的实例类,其定义可以到msado15.tlh、comdef.h 和comip.h这三个文件中找到。在msado15.tlh中有:
_COM_SMARTPTR_TYPEDEF(_Collection, __uuidof(_Collection));
经扩展后就得到了_ConnectionPtr类。_ConnectionPtr类封装了Connection对象的Idispatch接口指针,及一些必要的操作。我们就是通过这个指针来操纵Connection对象。类似地,后面用到的_CommandPtr和_RecordsetPtr类型也是这样得到的,它们分别表示命令对象指针和记录集对象的指针。
3.定义_RecordsetPtr型变量,并打开数据集
定义_RecordsetPtr型变量,然后通过它调用Recordset对象的Open方法,即可打开一个数据集。所以Recordset对象与MFC中的CRecordset类类似,它也有当前记录、当前记录指针的概念。如:
_RecordsetPtr m_pRecordset;
if(!FAILED(m_pRecordset.CreateInstance( __uuidof( Recordset )))
{
m_pDoc->m_initialized=FALSE;
return;
}
try
{
m_pRecordset->Open(_variant_t("mytable"), _variant_t((IDispatch *)pMyConnect,true), adOpenKeyset, adLockOptimistic, adCmdTable);
}
catch (_com_error &e)
{
::MessageBox(NULL,"无法打开mytable表。","提示", MB_OK | MB_ICONWARNING);
}
Recordset对象的Open方法非常重要,它的第一个参数可以是一个SQL语句、一个表的名字或一个命令对象等等;第二个参数就是前面建立的连接对象的指针。此外,用Connection和Command对象的Execute方法也能得到记录集,但是只读的。
4.读取当前记录的数据
最方便的方法如下:
try
{
m_pRecordset->MoveFirst();
while(m_pRecordset->adoEOF==VARIANT_FALSE)
{
//Retrieve column's value:
CString sName=(char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("name"))->Value);
short cAge=(short)(m_pRecordset->Fields->GetItem(_variant_t("age"))->Value); //Do something what you want to do:
......
m_pRecordset->MoveNext();
}
}//try
catch (_com_error &e)
{
CString str=(char*)e.Description();
::MessageBox(NULL,str+"\n又出毛病了。","提示", MB_OK | MB_ICONWARNING); }
其中的name和age都是字段名,读取的字段值分别保存在sName和cAge变量内。例中的Fields是Recordset对象的容器,GetItem方法返回的是Field对象,而Value则是Field对象的一个属性(即该字段的值)。通过此例,应掌握操纵对象属性的方法。例如,要获得Field 对象的Value属性的值可以直接用属性名Value来引用它(如上例),但也可以调用Get方法,例如:
CString
sName=(char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("name"))->GetValue());
还可以看到,判断是否到达记录集的末尾,使用记录集的adoEOF属性,其值若为真即到了结尾,反之则未到。判断是否到达记录集开头,则可用BOF属性。
另外,读取数据还有一个方法,就是定义一个绑定的类,然后通过绑定的变量得到字段值。
5.修改数据
try
{
m_pRecordset->MoveFirst();
while(m_pRecordset->adoEOF==VARIANT_FALSE)
{
m_pRecordset->Fields->GetItem(_variant_t("姓名"))->Value=_bstr_t("赵薇");
......
m_pRecordset->Update();
m_pRecordset->MoveNext();
}
}//try改变了Value属性的值,即改变了字段的值。
6.添加记录
新记录添加成功后,即自动成为当前记录。AddNew方法有两种形式,一个含有参数,而另一个则不带参数。
// Add new record into this table:
try
{
if(!m_pRecordset->Supports(adAddNew)) return;
m_pRecordset->AddNew();
m_pRecordset->Fields->GetItem(_variant_t("姓名"))->Value=_bstr_t("赵薇");
m_pRecordset->Fields->GetItem(_variant_t("性别"))->Value=_bstr_t("女");
m_pRecordset->Fields->GetItem(_variant_t("age"))->Value=_variant_t((short)20); m_pRecordset->Fields->GetItem(_variant_t("marry"))->Value=_bstr_t("未婚");
m_pRecordset->Update();
}//try
catch (_com_error &e)
{
::MessageBox(NULL, "又出毛病了。","提示",MB_OK | MB_ICONWARNING); }
7.删除记录
调用Recordset的Delete方法就行了,删除的是当前记录。要了解Delete的其它用法请查阅参考文献。
try
{
m_pRecordset->MoveFirst();
while(m_pRecordset->adoEOF==VARIANT_FALSE)
{
CString sName=(char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("姓名"))->Value);
if(::MessageBox(NULL,"姓名="+sName+"\n删除她吗?", "提示",MB_YESNO | MB_ICONWARNING)==IDYES)
{
m_pRecordset->Delete(adAffectCurrent);
m_pRecordset->Update();
}
m_pRecordset->MoveNext();
}
}//try
catch (_com_error &e)
{
::MessageBox(NULL,"又出毛病了。","提示",MB_OK | MB_ICONWARNING); }