分享
 
 
 

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

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

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

作者:成真

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

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

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

#import "c:\program files\common files\system\ado\msado15.dll"

no_namespace rename("EOF","adoEOF")

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

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

msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned

type, result still unsigned

MSDN建议我们不要理会。如果你实在不想看到的话可以在stdafx.h中加入一行下面的代码:

#pragma warning(disable:4146)

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

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

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

六、ADO封装类:CAdoConnection 和 CAdoRecordSet

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

我们来看看我是如何封装的:BOOL CAdoConnection::Connect(LPCTSTR strConnect, long lOptions)

{

m_strConnect = strConnect;

try

{

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

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

if (SUCCEEDED(hr))

{

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

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

{

return TRUE;

}

}

}

catch (_com_error e)

{

TRACE(_T(":( 连接数据库发生错误: %s\n"), e.ErrorMessage());

return FALSE;

}

catch (...)

{

TRACE(_T(":( 连接数据库时发生未知错误:"));

}

return FALSE;

}

使用之前先定义一个CAdoConnection 类对象如m_adoConnection,例如:CString strSrcName = "E:\\Access\\datebase.mdb";//假设在e盘有这样一个access的数据库文件

CString strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strSrcName;

m_adoConnection.Connect(LPCSTR(strConnect));

这样就连接到数据源了.

接着就是要打开记录集了,下面我对它的open方法的封装:使用进你可以忽略后面的三个参数,直接把一个SQL语句传给它.

HRESULT CAdoRecordSet::Open(LPCTSTR strSQL,

long lOption,

CursorTypeEnum CursorType,

LockTypeEnum LockType)

{

try

{

if (m_pConnection == NULL)

{

return -1;

}

else if (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_error e)

{

TRACE(_T(":( 打开记录集发生错误: %s\n"), e.ErrorMessage());

return -1;

}

}

例如我们可以这样来用:CAdoRecordSet rset;

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

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

rset.Open(m_strSQL);

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

7.1 连接数据库

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

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

void CAccessView::OnFileConnect()

{

CLogoDig dlg;

if (dlg.DoModal() == IDOK)

{

if (dlg.m_nSrcType == 0)

{

CString strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dlg.m_strSrcName;

GetDocument()-m_adoConnection.Disconnect();

if (!GetDocument()-m_adoConnection.Connect(LPCSTR(strConnect)))

{

AfxMessageBox("连接数据库失败!");

return;

}

}

else if (dlg.m_nSrcType == 1)

{

CString strConnect = "Provider=SQLOLEDB.1;Data Source=" + dlg.m_strSrcName +

";Initial Catalog=" + dlg.m_strDbName +

";User ID=" + 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.2 CCoolControlBar类和CMSFlexGrid类

在这个数据查询工具中我们使用了另外两个类:CCoolControlBar类和CMSFlexGrid类。.前者是我写的一个可以动态改变大小的控制条类,后者是系统自带一个网格控件,这个控件功能较少,但对于只用来显示一下查询结果已经够用了。

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

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

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

SetCols 设置总共拥有的列数

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

SetRows 设置总共拥有的行数

SetCol 设置当前列

SetRow 设置当前行

SetText 设置当前格的文本。位置由上面两个函数决定。

SetColWidth 设置列宽

7.3 数据的显示与处理

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

void CAccessView::OnSize(UINT nType, int cx, int cy)

{

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语句:void CAccessView::OnRun()

{

UpdateData();

UpdateGrid();

}

根据查询情况显示查询结果:void CAccessView::UpdateGrid()

{

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

if (!GetDocument()-m_adoConnection.IsOpen())

{

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

return;

}

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

m_wndGrid.ShowWindow(SW_HIDE);

m_editError.ShowWindow(SW_HIDE);

CAdoRecordSet rset;

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

if (rset.Open(m_strSQL, adCmdText) != 1)

{

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

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

UpdateData(FALSE);

m_editError.ShowWindow(SW_SHOW);

return;

}

//下面我用到的有些函数在类中可能没有封装,所以还是使用了try块,以防万一,:(

try

{

//取得记录集的字段数和行数----------------------------------

int nrow = rset.GetRecordCount();

int ncol = rset.GetFields()-Count;

//设置网格控件的列数和行数----------------------------------

m_wndGrid.SetCols(ncol);

m_wndGrid.SetRows(nrow + 1); // 多留一行以显示字段名

m_wndGrid.SetFixedCols(0);

CString value;

//填充字段名-----------------------------------------------

m_wndGrid.SetRow(0);

for (int i = 0; i 2000 ? 2000 : nwidth;

m_wndGrid.SetColWidth(i, nwidth);

}

//读取记录集-----------------------------------------------

int n = 1;

while (!rset.IsEOF())

{

m_wndGrid.SetRow(n);

n++;

for (int i = 0; i < ncol; i++)

{

m_wndGrid.SetCol(i);

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

m_wndGrid.SetText(LPCTSTR(value));

}

rset.MoveNext();

}

m_wndGrid.ShowWindow(SW_SHOW);

}

catch (_com_error)

{

return;

}

}

记录集用完后,可以及时用Close()将它关闭,以释放相应的资源. CAdoRecordSet类折构函数,会自动关闭记录.

7.4 其它功能(获取数据库信息)

我们还可以加一点另外的功能:在右边的树控件中显示数据库所拥有的表单和它们各自所拥有所有字段.这段主要是用来演示如何获得数据库的一些信息.

主要实现函数如下:void CLeftBar::InitTree()

{

CAdoRecordSet rset;

_bstr_t Value;

CString strTablename = "";

HTREEITEM item = TVI_ROOT;

try

{

if (GetDocument()-m_adoConnection.GetConnection()-State != adStateOpen) return;

m_ctrlTree.DeleteAllItems();

//取得数据库字段信息---------------------------------------------

rset = GetDocument()-m_adoConnection.OpenSchema (adSchemaColumns);

while (!rset.IsEOF())

{

CString strValue;

//取得表名-----------------------------------------------

rset.GetValueString(strValue, "TABLE_NAME");

if (strValue != strTablename)

{

strTablename = strValue;

item = m_ctrlTree.InsertItem((LPCTSTR)strTablename, 1, 1);

}

//取得字段名--------------------------------------------

Value = rset.GetFields()-Item[L"COLUMN_NAME"]-Value;

m_ctrlTree.InsertItem((LPCTSTR)Value, 2, 2, item);

rset.MoveNext();

}

}

catch(_com_error e)

{

}

}

当然,你一样可以查询看数据库还拥有哪些视图,索引等信息. 这里还用到了CCoolControlBar类,但如何使用这里就不细说了,毕竟现在主要谈的是ADO,如果你对它有什么兴趣可以真接找我.:)

一个小查询器就差不多完成了。

八、其他参考信息(有很多我在源代码里面已有详细注释,就不一一重复了)

_Connection、_Recordset、_Field参考

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有