- 浏览: 1997275 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
使用ADO封装类的数据库程序开发实例(下)
原文地址:http://www.vckbase.com/document/viewdoc/?id=611
在《使用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 对象--------------------------- HRESULT hr = 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 < ncol; i++) { m_wndGrid.SetCol(i); m_wndGrid.SetText(LPCSTR(rset.GetFieldName(i))); //设置当前列的大致宽度------------------------------- int nwidth = rset.GetFieldDefineSize(i) * 200; nwidth = nwidth > 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参考
发表评论
-
__declspec(novtable) 的用法
2010-11-27 14:37 1527__declspec(novtable) 的用法 __d ... -
解决URLDownloadToFile缓存问题的两种方法
2010-09-09 15:18 2812解决URLDownloadToFile缓存问题的两种方法 ... -
修改richedit背景
2010-07-19 22:52 1597RichEditCtrl::SetBackgroundCo ... -
使用ADO封装类的数据库程序开发实例(上)
2010-07-12 15:28 1169使用ADO封装类的数据库 ... -
VC防止窗口和控件闪烁的方法
2010-07-09 21:16 19571、将Invalidate()替换为Invalidate ... -
防止窗口闪烁地办法
2010-07-09 21:13 1463防止窗口闪烁地办法 也许我们都碰到过这种情况,当你 ... -
使用ADO _ConnectionPtr
2010-07-06 16:04 5215// GetUser.cpp : Defines the ... -
VC用ADO访问数据库全攻略
2010-07-06 15:29 1760VC用ADO访问数据库全 ... -
深入GetMessage和PeekMessage (引自-MSDN技术组)
2010-06-10 16:59 3669深入GetMessage和PeekMessage (引自 ... -
界面编程总结(1)
2010-06-02 13:32 3954原文地址:http://blog.csdn.net/byx ... -
获取信息的有关Windows API
2010-05-27 10:01 3081获取信息的有关Windows API 1.窗口信息 ... -
VC中如何实现窗口的隐藏
2010-05-13 10:08 7791VC中如何实现窗口的隐藏 用MFC做的Dialog ... -
SetConsoleCtrlHandler 处理控制台消息
2010-05-07 17:32 17982SetConsoleCtrlHandler 处理控制台消 ... -
解决决错误: error C2850: 'PCH header file'
2010-04-27 19:45 1881解决决错误: error C2850: 'PCH hea ... -
VC++ GDI+编程的字体和文本绘制
2010-04-13 13:12 7901字体是文字显示和打印的外观形式,它包括了文字的字样、风格和尺寸 ... -
VC利用GDI+显示透明的PNG图片
2010-04-12 16:59 114661.在你将要使用GDI+的工程中,完成初始化 ... -
GDI+编程基础(一)GDI+ Vs GDI
2010-04-12 15:59 2294下载源代码一、GDI GDI是位于应用程序与不同硬件之间 ... -
VC画图
2010-04-12 15:50 1487BOOL DrawPic(HDC hdc, TCHAR* ... -
对话框的数据交换--MFC深入浅出
2010-04-12 10:43 2397对话框数据交换指以下两种动作,或者是把内存数据写入对应的控 ... -
MFC中获取命令行参数的几种方法
2010-04-08 18:09 2927在MFC程序中,可以用以下几种方法来获取命令行参数。为方便 ...
相关推荐
使用ADO封装类的数据库程序开发实例[第二版]
使用ADO封装类的数据库程序开发实例[第二版] 源码,包括sql server和access,包括图片存取,xml文件导入、导出,封装很强大,
使用ADO封装类的数据库程序开发实例
使用ADO封装类的数据库程序开发实例.zip
使用ADO封装类的数据库程序开发实例,通过几个小实例讲述了ADO的主要使用方法,对数据库开发很有!
使用ADO封装类的数据库程序开发实例.doc
《使用ADO封装类的数据库程序开发实例》配套代码.zip
使用ADO封装类的数据库程序开发实例[第二版]
Ado_使用ADO封装类的数据库程序开发实例[参考].pdf
本代码是一个用ADO封装类开发的数据库应用实例
使用ADO封装类的数据库程序开发实例[第二版]VC源代码
VC编程封装ADO类 VC中利用ADO共同实现数据库的操作 在VC中使用ADO开发数据库应用程序 用C++访问SQLServer2000的实例
《使用ADO封装类的数据库程序开发实例》配套代码 - BUG修订版VC源代码
本书的内容分为三部分,第一部分介绍了Visual C++数据库开发的常用技巧和技术,并给出相关的学习建议。第二部分介绍了使用Visual C++开发数据库时常用到的经典模块,包括数据库操作模块和日志记录模块;最后一部分...
1.只需引用头文件中的函数,就可以实现常用的数据库操作,DLL中使用的是ADO连接方式,使用时无需关注ADO的这些细节,也没必要重新引用ADO的动态链接库 2.充分利用C++的函数重载功能,读取字段采用GetRsField函数,...
17.5 数据库封装类说明 17.5.1 概述 17.5.2 设计步骤 17.5.3 程序相关代码 17.6 主窗体设计 17.6.1 菜单设计 17.6.2 设计背景画面 17.6.3 程序设计与编码 17.7 采购管理设计 17.7.1 概述 17.7.2 设计步骤 17.7.3 ...
17.5 数据库封装类说明 17.5.1 概述 17.5.2 设计步骤 17.5.3 程序相关代码 17.6 主窗体设计 17.6.1 菜单设计 17.6.2 设计背景画面 17.6.3 程序设计与编码 17.7 采购管理设计 17.7.1 概述 17.7.2 设计步骤 17.7.3 ...
本书的内容分为三部分,第一部分介绍了Visual C++数据库开发的常用技巧和技术,并给出相关的学习建议。第二部分介绍了使用Visual C++开发数据库时常用到的经典模块,包括数据库操作模块和日志记录模块;最后一部分...
ADO封装类的数据库程序开发实例ADO wrapper class instance of the database application development