耗费了一下午,研究了一下VC的数据库编程,写了这个测试程序。主要的功能为实现access数据库的添加与删除,同时动态的将数据库数据显示在flexgrid控件中。下面把过程记录下来,以备后用。
一。ADO简介
ADO提供了一组非常简单,将一般通用的数据访问细节进行封装的对象。由于ODBC数据源也提供了一般的OLE DB Privider,所以ADO不仅可以应用自身的OLE DB Privider,而且还可以应用所有的ODBC驱动程序。关于OLE DB和ADO的其它详细情况,读者可以自行查阅相关书籍或MSDN,这里就不一一说明了。让我们直接步入主题,如何掌握ADO这种数据库访问技术ADO的操作方法和前面讲过的DAO的操作在很多方面存在相似之处。
二。主要控件的布置
程序运行效果如图:
1.进入工程向导,建立基于对话框的mfc应用程序。名为databasetest。
加入flexgrid控件:工程--->添加到工程------->components and controls。找到Microsoft Flexgrid control,然后insert。添加几个static box 和editbox,添加两个botton,实现插入和删除的功能。
2.打开access2003,建立空数据库Demo.mdb。建立表Table1。设置编号,时间,采样点数,累加次数,数据5个字段,分别为自动编号,时间/日期,数字,数字和备注类型
如图:
三。数据库操作过程
1.用#import指令引入ADO类型库
要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll的附属资源中,只需要直接用 #import引用它既可。可以直接在Stdafx.h文件中加入下面语句来实现:
#import "c:/program files/common files/system/ado/msado15.dll" / no_namespace / rename ("EOF", "adoEOF") |
其中路径名可以根据自己系统安装的ADO支持文件的路径来自行设定。当编译器遇到#import语句时,它会为引用组件类型库中的接口生成包装类,#import语句实际上相当于执行了API涵数LoadTypeLib()。#import语句会在工程可执行程序输出目录中产生两个文件,分别为*.tlh(类型库头文件)及*.tli(类型库实现文件),它们分别为每一个接口产生智能指针,并为各种接口方法、枚举类型,CLSID等进行声明,创建一系列包装方法。语句no_namespace说明ADO对象不使用命名空间,rename ("EOF", "adoEOF")说明将ADO中结束标志EOF改为adoEOF,以避免和其它库中命名相冲突。
2.COM初始化
使用AfxOleInit()来初始化COM库,这项工作通常在CWinApp::InitInstance()的重载函数中完成。代码如下:
BOOL CDatabasetestApp::InitInstance()
{
................................
AfxOleInit();
..................................
}
3.CDatabasetestDlg.h中定义个控件类变量:
// 定义ADO连接、命令、记录集变量指针
_ConnectionPtr m_pConnection;
_CommandPtr m_pCommand;
_RecordsetPtr m_pRecordset;
// Dialog Data
//{
{AFX_DATA(CDatabasetestDlg)
enum { IDD = IDD_DATABASETEST_DIALOG };
CEdit m_CSamplingTime;
CString m_SamplingTime;
UINT m_AccNum;
UINT m_SamplingNum;
CMSFlexGrid m_DataGrid;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{
{AFX_VIRTUAL(CDatabasetestDlg)
4.这样就可以数据库的实际操作了。首先在主应用程序databasetext.cpp中。主对话框弹出之前添加代码,创建一个实例指针,再用Open打开一个库连接,它将返回一个IUnknown的自动化接口指针。
m_pConnection.CreateInstance(__uuidof(Connection));
// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些想不到的错误。jingzhou xu
try
{
// 打开本地Access库Demo.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
注:ConnectionPtr智能指针,通常用于打开、关闭一个库连接或用它的Execute方法来执行一个不返回结果的命令语句(用法和_CommandPtr中的Execute方法类似)。
5.在databasetestDlg.cpp的前面加入:
//引用应用类
extern CDatabasetestApp theApp;
在::OnInitDialog()加入代码:
// 使用ADO创建数据库记录集
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些想不到的错误。jingzhou xu
try
{
m_pRecordset->CursorLocation = adUseClient;
m_pRecordset->Open("SELECT * FROM Table1", // 查询DemoTable表中所有字段
theApp.m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
}