Ado使用ADO封装类的数据库程序开发实例.docx

上传人:b****5 文档编号:3977677 上传时间:2022-11-26 格式:DOCX 页数:14 大小:23.58KB
下载 相关 举报
Ado使用ADO封装类的数据库程序开发实例.docx_第1页
第1页 / 共14页
Ado使用ADO封装类的数据库程序开发实例.docx_第2页
第2页 / 共14页
Ado使用ADO封装类的数据库程序开发实例.docx_第3页
第3页 / 共14页
Ado使用ADO封装类的数据库程序开发实例.docx_第4页
第4页 / 共14页
Ado使用ADO封装类的数据库程序开发实例.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

Ado使用ADO封装类的数据库程序开发实例.docx

《Ado使用ADO封装类的数据库程序开发实例.docx》由会员分享,可在线阅读,更多相关《Ado使用ADO封装类的数据库程序开发实例.docx(14页珍藏版)》请在冰豆网上搜索。

Ado使用ADO封装类的数据库程序开发实例.docx

Ado使用ADO封装类的数据库程序开发实例

使用ADO封装类的数据库程序开发实例(上)

作者:

成真

下载本文示例源代码

源代码运行效果图如下:

一、前言

用过ADO的人都知道,调用ADO要处理很多"麻烦"的事情,如异常处理等,要写很多try-catch块.有点不甚其烦。

我干脆把常用的函数都封装起来,免去老是要写try-catch块的麻烦。

做起来虽然没有什么技术含量,但也比较烦琐,所以只完成了一部分,且由于时间及个人水平有限,没有对封装的东西作全面测试,并必定有很多错误,但想到对某些朋友可能有用。

所以先"捐"出来了。

^-^.

在介绍这两个类之前,让我们先来了解一下ADO,本文假设你已有一定的编程能力:

二、了解ADO的结构体系

ADO(ActiveXDataObject,Active数据对象)是Microsoft提供的一种面向对象,与语言无关的数据访问应用编程接口。

据大部分资料介绍,它有如下主要特点:

一:

易于使用。

二:

可以访问多种数据源。

三:

访问速度快,效率高:

四:

方便Web应用。

五:

技术编程接口丰富。

六:

低内存支出和占用磁盘空间较少.

正是看到ADO这么多优点,使我对用ADO开发数据库产生了兴趣.ADO用起来也如前面所说的一样,确实不难。

总的来说,ADO模型包括了下列对象:

连接(Connection)、命令(Command)、记录集(Recordset)、字段(Field)、参数(Parameter)、错误(Error)、属性(Property)、集合、事件.它们之间的关系如下图:

(1)我们最常用的主要是Connection、Recordset及Command这三个对象.

(2)对于访问一个数据库来说,我们一般先建立一个ADO连接.

(3)ADO连接可以直接执行SQL语句来操纵数据库,但如果我们要对数据在应用程序和数据源之间进行存取的话,就需要用到记录集对象。

一个ADO连接可以有多个ADO连接,但一个ADO连接一般只能对应一个且必须对应一个ADO连接.

(4)另外如果你可进行更高级别的访问的话,还可能要用到命令对象。

例如要调用存储过程等。

(5)一个记录集包含有一个字段集,一个字段集则包含有多个字段对象。

(6)同样一个命令对象也包含一个参数集,一个参数集则包含有多个参数对象。

(7)连接对象也有一个错误集并包含有多个错误对象。

这就是ADO各对象之间大致的关系.

三、了解ADO连接

在使用数据库之前,要先建立连接.一般先用CreateInstance方法创建ADO连接对象,然后就可以用Open方法连接到数据库。

它的原型是Open(BSTRConnectionString,BSTRUserID,BSTRPassword,longOptions);其中UserID和Password如果在ConnectionString已经指明了用户名和密码,一般就可以不必管它们.Options指的是是以同步方式(adConnectUnspecified)还是以异步方式(adAsyncConnect)进行连接,默认为同步.这个函数的关键这处在于ConnectionString参数,它决定了我们将以什么方式连接到什么数据源,例如:

如果是Access数据库,它的格式则一般为:

"Provider=Microsoft.Jet.OLEDB.4.0;DataSource=db.mdb";

如果是SQLServer:

"Provider=SQLOLEDB.1;DataSource=sqlservername;InitialCatalog=master;UserID=sa;PWD=password";

具体的内容视你的环境而定.要连接到其他数据库,请参考相关的资料.

例如:

_ConnectionPtrpConnection;

LPCSTRstrConnect="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=test.mdb";

//创建Connection对象---------------------------

HRESULThr=pConnection.CreateInstance("ADODB.Connection");

//设置连接时间-----------------------------------

pConnection->put_ConnectionTimeout(long(5));

if(SUCCEEDED(hr))

{

//连接数据库---------------------------------------------

pConnection->Open(strConnect,"","",adConnectUnspecified))

}

 

四、了解ADO记录集

创建了ADO连接,我们就可以通过ADO记录集来访问数据库了.同样,在使用记录集之前要先创建对象.然后调用Open方法打开记录集.它不但可以执行普通的SQL语句,还可以调用存储过程等等:

Open(VARIANTSource,VARIANTActiveConnection,CursorTypeEnumCursorType,LockTypeEnumLockType,LONGOptions).

其中ActiveConnection参数为一个有效的Connection对象名,就是我们在上面所说过的ADO连接对象.

CursorType参数指的是记录集光标类型,在官方的资料中是这样说明它的取值类型的:

1.adOpenForwardOnly仅向前游标,默认值。

除了只能在记录中向前滚动外,与静态游标相同。

当只需要在记录集中单向移动时,使用它可提高性能。

2.adOpenKeyset键集游标。

尽管从您的记录集不能访问其他用户删除的记录,但除无法查看其他用户添加的记录外,键集游标与动态游标相似。

仍然可以看见其他用户更改的数据。

3.adOpenDynamic动态游标。

可以看见其他用户所作的添加、更改和删除。

允许在记录集中进行所有类型的移动,但不包括提供者不支持的书签操作。

4.adOpenStatic静态游标。

可以用来查找数据或生成报告的记录集合的静态副本。

另外,对其他用户所作的添加、更改或删除不可见。

我们现在可不用管这么多,就用默认的adOpenStatic类型吧.

LockType参数,用于指示在什么时候锁定记录:

AdLockReadOnly(默认值)只读-不能改变数据。

AdLockPessimistic保守式锁定(逐个)-提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录。

AdLockOptimistic开放式锁定(逐个)-提供者使用开放式锁定,只在调用Update方法时才锁定记录。

AdLockBatchOptimistic开放式批更新-用于批更新模式(与立即更新模式相对)。

Options参数指的是操作类型:

adCmdText指示strSQL为命令文本,即普通的SQL语句.

adCmdTable指示ADO生成SQL查询以便从在strSQL中命名的表中返回所有行.

adCmdTableDirect指示所作的更改在strSQL中命名的表中返回所有行.

adCmdStoredProc指示strSQL为存储过程.

adCmdUnknown指示strSQL参数中的命令类型为未知

adCmdFile指示应从在strSQL中命名的文件中恢复保留(保存的)Recordset.

adAsyncExecute指示应异步执行strSQL.

adAsyncFetch指示在提取InitialFetchSize属性中指定的初始数量后,应该异步提取所有剩余的行.如果所需的行尚未提取,主要的线程将被堵塞直到行重新可用.

adAsyncFetchNonBlocking指示主要线程在提取期间从未堵塞.如果所请求的行尚未提取,当前行自动移到文件末尾.

唉又是一大串,如果你只是要执行SQL语句,就把它设为adCmdText吧.这样Source就是你要执行的SQL语句了.

例如:

LPCSTRstrSQL="select*fromvckbasetable";

_RecordsetPtrpRecordset;

pRecordset.CreateInstance("ADODB.Recordset");

pRecordset->Open(_bstr_t(strSQL),

_variant_t((IDispatch*)pConnection,true),

adOpenStatic,

AdLockOptimistic,

adCmdText);

ADO中读取记录集中指定字段的值一般有两种方法:

第一种:

FieldsPtrpFields;

pRecordset->get_Fields(&pFields);

pFields->Item[L"COLUMN_NAME"]->Value;

//或pFields->Item[long(index)]->Value;

//其中index为整型或长整型.GetFields()函数返回的是记录集对象的字段集合对象的指针.

第二种:

pRecordset->get_Collect("COLUMN_NAME");

//或pRecordset->get_Collect(long(index));

它们都将返回一个_variant_t类型的值,推荐使用后一种方法.

例如:

intncol=rset.GetFieldsCount();

while(!

rset.IsEOF())

{

for(inti=0;i

{

rset.GetValueString(value,(long)(i));

}

rset.MoveNext();

}

四、了解ADO字段.

一个记录集通常包含多个字段,通过访问记录,我们可以得到很多有用的信息,如字段名,字段的数据类型,定义的宽度,实际占有的宽度等等:

一般用记录集的get_Fields方法取得字段集合对象:

FieldsPtrpFields;

Recordset->get_Fields(&pFields);

然后可以获得相应的字段对象:

longlIndex=0;

FieldPtrpf=pFields->GetItem(_variant_t(lIndex));

//或:

FieldPtrpf=pFields->GetItem("COLUMN_NAME");

字段对象有很多有用的属性,这些可以参考我的源代码或其他相关资料.如:

get_ActualSize(long*pl)//实际宽度

get_Attributes(long*pl)//属性

get_DefinedSize(long*pl)//定义宽度(以字节为单位,如整型为4,长整型为8...)

get_Name(BSTR*pbstr)//字段名

get_Type(DataTypeEnum*pDataType)//数据类型

get_Value(VARIANT*pvar)//字段的值

有了以上对ADO的基本了解后,我们将正式开始编写应用程序,请看下文。

 

使用ADO封装类的数据库程序开发实例(下)

作者:

成真

在《使用ADO封装类的数据库程序开发实例(上)》中详细介绍了ADO的一些基本的概念,接下来让我们在此基础上进行具体的编程。

五、开始编写ADO应用程序.

使用ADO之前,我们另外还需要添加下面的语句,如此把ADO的库引入到工程中.#import"c:

\programfiles\commonfiles\system\ado\msado15.dll"

no_namespacerename("EOF","adoEOF")

根据机器安装时候的设置不同具体的路径可能不一样。

另外编译的时候会出现如下的警告信息:

msado15.tlh(405):

warningC4146:

unaryminusoperatorappliedtounsignedtype,resultstillunsigned

MSDN建议我们不要理会。

如果你实在不想看到的话可以在stdafx.h中加入一行下面的代码:

#pragmawarning(disable:

4146)

这样这个警告信息就不会再出现了。

ADO使用了COM,所以在使用ADO之前,必须对COM进行了初始化,否则无法使用.你可以使用AfxOleInit()来初始化,但只能初始一次,你不能多次调用此函数,建议你在应用程序的APP类的InitInstance方法中进行初始化.

上面这些一般相关的资料都有详细说明,因此我就不细说了,下面我们来看看如何我封装的两个类。

六、ADO封装类:

CAdoConnection和CAdoRecordSet

首先当然是要连接到数据源了,连接到数据源的函数是_CAdoConnection的Connect方法,它封装了ADO连接对象的CreateInstance和Open方法:

我们来看看我是如何封装的:

BOOLCAdoConnection:

:

Connect(LPCTSTRstrConnect,longlOptions)

{

m_strConnect=strConnect;

try

{

///创建Connection对象---------------------------

HRESULThr=m_pConnection.CreateInstance("ADODB.Connection");

if(SUCCEEDED(hr))

{

//连接数据库---------------------------------------------

if(SUCCEEDED(m_pConnection->Open(strConnect,"","",lOptions)))

{

returnTRUE;

}

}

}

catch(_com_errore)

{

TRACE(_T(":

(连接数据库发生错误:

%s\n"),e.ErrorMessage());

returnFALSE;

}

catch(...)

{

TRACE(_T(":

(连接数据库时发生未知错误:

"));

}

returnFALSE;

}

使用之前先定义一个CAdoConnection类对象如m_adoConnection,例如:

CStringstrSrcName="E:

\\Access\\datebase.mdb";//假设在e盘有这样一个access的数据库文件

CStringstrConnect="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="+strSrcName;

m_adoConnection.Connect(LPCSTR(strConnect));

这样就连接到数据源了.

接着就是要打开记录集了,下面我对它的open方法的封装:

使用进你可以忽略后面的三个参数,直接把一个SQL语句传给它.

 

HRESULTCAdoRecordSet:

:

Open(LPCTSTRstrSQL,

longlOption,

CursorTypeEnumCursorType,

LockTypeEnumLockType)

{

try

{

if(m_pConnection==NULL)

{

return-1;

}

elseif(m_pRecordset==NULL)

{

m_pRecordset.CreateInstance("ADODB.Recordset");

}

m_pRecordset->Open(_bstr_t(strSQL),

_variant_t((IDispatch*)m_pConnection->GetConnection(),true),

CursorType,LockType,lOption);

if(m_pRecordset==NULL)

{

return-1;

}

return(m_pRecordset->adoEOF)?

0:

1;

}

catch(_com_errore)

{

TRACE(_T(":

(打开记录集发生错误:

%s\n"),e.ErrorMessage());

return-1;

}

}

例如我们可以这样来用:

CAdoRecordSetrset;

rset.SetAdoConnection(&(GetDocument()->m_adoConnection));//记得要先指定相应的连接对象,否则会出错.

m_strSQL="select*fromcity";//要执行的SQL语句.

rset.Open(m_strSQL);

七.写一个数据查询工具(我对实现过程只稍作了介绍,具体内容请参考源代码):

7.1连接数据库

首先要编写连接到数据库的代码,为此,我写了一个对话框类(CLogoDig)用来选择不同的数据源,

然后在视图类(这个视图类是从CFromView类派生的)添加CAdoConnection类成员变量,并添加如下连接函数voidCAccessView:

:

OnFileConnect()

{

CLogoDigdlg;

if(dlg.DoModal()==IDOK)

{

if(dlg.m_nSrcType==0)

{

CStringstrConnect="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="+dlg.m_strSrcName;

GetDocument()->m_adoConnection.Disconnect();

if(!

GetDocument()->m_adoConnection.Connect(LPCSTR(strConnect)))

{

AfxMessageBox("连接数据库失败!

");

return;

}

}

elseif(dlg.m_nSrcType==1)

{

CStringstrConnect="Provider=SQLOLEDB.1;DataSource="+dlg.m_strSrcName+

";InitialCatalog="+dlg.m_strDbName+

";UserID="+dlg.m_strUserName+";PWD="+dlg.m_strPassWord;

GetDocument()->m_adoConnection.Disconnect();

if(!

GetDocument()->m_adoConnection.Connect(LPCSTR(strConnect)))

{

AfxMessageBox("连接数据库失败!

");

return;

}

}

((CMainFrame*)GetParentFrame())->m_wndLeftBar.InitTree();

}

}

7.2CCoolControlBar类和CMSFlexGrid类

在这个数据查询工具中我们使用了另外两个类:

CCoolControlBar类和CMSFlexGrid类。

.前者是我写的一个可以动态改变大小的控制条类,后者是系统自带一个网格控件,这个控件功能较少,但对于只用来显示一下查询结果已经够用了。

在编辑CFromView类对话框资源视图中,在正在编辑的对话框资源上点右键,选择插入ActiveX控件,然后选择"MicrosoftFlexGridcontrol"控件。

然后在类向导中在"MemberVariables"页中为它添加变量,类向导会提示要引入向个头文件,确认,这时你的类视图中就会增加好几个类。

先介绍一个要用到的几个函数:

SetCols设置总共拥有的列数

SetFixedCols设置固定的列数,即背景为灰色的那种

SetRows设置总共拥有的行数

SetCol设置当前列

SetRow设置当前行

SetText设置当前格的文本。

位置由上面两个函数决定。

SetColWidth设置列宽

7.3数据的显示与处理

另外我们还需要两个编辑控件,用来输入SQL语句和显示错误信息.并在OnSize消息处理函数中动态设置它们的位置:

voidCAccessView:

:

OnSize(UINTnType,intcx,intcy)

{

CFormView:

:

OnSize(nType,cx,cy);

if(m_wndGrid.GetSafeHwnd()!

=NULL)//控件是否已经创建

{

m_editError.MoveWindow(0,10,cx,cy-50);

m_wndGrid.MoveWindow(0,0,cx,cy-40);

m_editSQL.MoveWindow(0,cy-40,cx,40);

}

}

添加一条菜单项并添加相应响应函数,用于开始执行输入的SQL语句:

voidCAccessView:

:

OnRun()

{

UpdateData();

UpdateGrid();

}

根据查询情况显示查询结果:

voidCAccessView:

:

UpdateGrid()

{

//连接对象是否打开------------------------------------------

if(!

GetDocument()->m_adoConnection.IsOpen())

{

AfxMessageBox("数据库没有打开或已经关闭!

");

return;

}

//先隐藏这两个控件------------------------------------------

m_wndGrid.ShowWindow(SW_HIDE);

m_editError.ShowWindow(SW_HIDE);

CAdoRecordSetrset;

rset.SetAdoConnection(&(GetDocument()->m_adoConnection));

if(rset.Open(m_strSQL,adCmdText)!

=1)

{

//查询出错,取得出错信息并显示在编辑控件里面------------------

m_strError=GetDocument()->m_adoConnection.GetLastError();

UpdateData

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1