用ado操作access2003数据库时间:2021-09-18 14:44:261、头文件 MyAdo.h ************************************ #pragma once // CMyAdo 对话框 class CMyAdo : public CDialog { DECLARE_DYNAMIC(CMyAdo) public: CMyAdo(CWnd* pParent = NULL); // 标准构造函数 virtual ~CMyAdo(); // 对话框数据 enum { IDD = IDD_MYADO }; public: void InitDataSheet(void); void OpenDataSheet(void); void ReadDataSheet(BYTE type); void InsertDataSheet(void); void MoveDataSheet(void); void RevampDataSheep(UINT pos, BYTE type, UINT data); void DeleteDataSheet(void); void CloseDataSheet(void); private: //_variant_t RecordsAffected; _ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() }; 2、CPP文件 // MyAdo.cpp : 实现文件 // #include "stdafx.h" #include "MyTest.h" #include "MyAdo.h" // CMyAdo 对话框 IMPLEMENT_DYNAMIC(CMyAdo, CDialog) CMyAdo::CMyAdo(CWnd* pParent /*=NULL*/) : CDialog(CMyAdo::IDD, pParent) { } CMyAdo::~CMyAdo() { //如果已经打开了连接则关闭它 if(m_pConnection->State) { m_pConnection->Close(); m_pConnection = NULL; } CloseDataSheet(); } void CMyAdo::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } void CMyAdo::InitDataSheet(void) { /* _ConnectionPtr智能指针,通常用于打开、关闭一个库连接或用它的Execute方法 来执行一个不返回结果的命令语句(用法和_CommandPtr中的Execute方法类似)。 打开一个库连接。先创建一个实例指针,再用Open打开一个库连接,它将返回一个IUnknown的自动化接口指针。 */ // 初始化OLE 库 if (!AfxOleInit()) { MessageBox(L"初始化OLE 库失败"); return; } //初始化COM,创建ADO连接等操作 m_pConnection.CreateInstance(__uuidof(Connection)); // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息, // 因为它有时会经常出现一些意想不到的错误。 try { ///连接数据库 ///下面一句中连接字串中的Provider是针对ACCESS2000环境的, //对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F://VS//VS//Fly//MyTest//MyTest//MyTest//MyTest.mdb","","",adModeUnknown); } catch(_com_error e)///捕捉异常 { CString errormessage; errormessage.Format(L"连接数据库失败!/r错误信息:%s", e.ErrorMessage()); MessageBox(errormessage);///显示错误信息 } } void CMyAdo::OpenDataSheet(void) { /* 打开库内表名为list_one的数据表 */ //打开数据表 m_pRecordset.CreateInstance(__uuidof(Recordset)); // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息, // 因为它有时会经常出现一些意想不到的错误。 try { m_pRecordset->Open("SELECT * FROM list_one", this->m_pConnection.GetInterfacePtr(),//获取数据库的IDispatch指针 adOpenStatic,adLockOptimistic,adCmdText); //m_pRecordset->Open("SELECT * FROM list_one", // _variant_t((IDispatch*)m_pConnection,true), // adOpenStatic,adLockOptimistic,adCmdText); } catch(_com_error *e) { MessageBox(e->ErrorMessage()); } } void CMyAdo::ReadDataSheet(BYTE type) { /* 将表内数据全部读出并显示在列表框内,m_AccessList为列表框的成员变量名。 如果没有遇到表结束标志adoEOF,则用GetCollect(字段名) 或m_pRecordset->Fields->GetItem(字段名)->Value方法,来获取当前记录指针所指的字段值, 然后再用MoveNext()方法移动到下一条记录位置。 */ //选择MODE的类型 CString str; switch(type) { case POWER:str = L"电源参数(mv)"; break; case VIDEO:str = L"视频参数"; break; case SOUND:break; case LINE:break; case POWER_CURRENT:break; default:str = L"";break; } if (str.IsEmpty()) return; //读取表内数据 UINT total=0; UINT time=1; CString strDebug; UINT vValue=0; try { //移到首条记录 if(!m_pRecordset->BOF) m_pRecordset->MoveFirst(); else { MessageBox(L"表内数据为空"); return; } //在第行,读出此类记录的总记录数 m_pRecordset->MoveFirst(); if (type == POWER) total = m_pRecordset->GetCollect((const _variant_t)str); else if (type == VIDEO) total = m_pRecordset->GetCollect((const _variant_t)str); else if (type == SOUND) total = m_pRecordset->GetCollect((const _variant_t)str); else if (type == LINE) total = m_pRecordset->GetCollect((const _variant_t)str); else if (type == POWER_CURRENT) total = m_pRecordset->GetCollect((const _variant_t)str); //strDebug.Format(L"%d", total); //MessageBox(strDebug); //移到第条记录 m_pRecordset->MoveNext(); CWnd *pWnd = CWnd::FindWindow(NULL, L"MyTest"); if (!pWnd) { MessageBox(L"窗口无效"); } //读入库中各字段并加入列表框中 while (!m_pRecordset->IsAdoEOF && time <= total) { //取得第列的值,从开始计数,你也可以直接给出列的名称,如下一行 //vID = m_pRecordset->GetCollect(_variant_t((long)0)); vValue = m_pRecordset->GetCollect((const _variant_t)str); //strDebug.Format(L"Value=%d", vValue); //MessageBox(strDebug); pWnd->SendMessage(UM_USEMESSAGE,time,vValue); //if(vUsername.vt != VT_NULL && vBirthday.vt != VT_NULL) //{ // str.Format(L"Username:%s", (LPCTSTR)_bstr_t(vUsername)); // MessageBox(str); //} //移到下一条记录 m_pRecordset->MoveNext(); time++; } } catch(_com_error *e) { MessageBox(e->ErrorMessage()); } } void CMyAdo::InsertDataSheet(void) { /* 可以先用AddNew()方法新增一个空记录,再用PutCollect(字段名,值)输入每个字段的值, 最后再Update()更新到库中数据既可。其中变量m_Name和m_Age分别为姓名及年龄编辑框的成员变量名。 */ try { // 写入各字段值 m_pRecordset->AddNew(); //m_pRecordset->PutCollect("Name", _variant_t(m_Name)); //m_pRecordset->PutCollect("Age", atol(m_Age)); m_pRecordset->Update(); //AfxMessageBox("插入成功!"); } catch(_com_error *e) { MessageBox(e->ErrorMessage()); } } void CMyAdo::MoveDataSheet(void) { /* 移动记录指针。移动记录指针可以通过MoveFirst()方法移动到第一条记录、 MoveLast()方法移动到最后一条记录、MovePrevious()方法移动到当前记录的前一条记录、 MoveNext()方法移动到当前记录的下一条记录。但我们有时经常需要随意移动记录指针到任意记录位置时, 可以使用Move(记录号)方法来实现,注意: Move()方法是相对于当前记录来移动指针位置的, 正值向后移动、负值向前移动,如:Move(3),当前记录是时,它将从记录开始往后再移动条记录位置。 */ try { //int curSel = m_AccessList.GetCurSel(); // 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针 m_pRecordset->MoveFirst(); //m_pRecordset->Move(long(curSel)); } catch(_com_error *e) { MessageBox(e->ErrorMessage()); } } void CMyAdo::RevampDataSheep(UINT pos, BYTE type, UINT data) { /* 修改记录中字段值。可以将记录指针移动到要修改记录的位置处, 直接用PutCollect(字段名,值)将新值写入并Update()更新数据库既可。 可以用上面方法移动记录指针,修改字段值代码如下所示: */ //选择MODE的类型 CString str; switch(type) { case POWER:str = L"电源参数(mv)"; break; case VIDEO:str = L"视频参数"; break; case SOUND:break; case LINE:break; case POWER_CURRENT:break; default:str = L"";break; } if (str.IsEmpty()) return; try { m_pRecordset->MoveFirst(); m_pRecordset->Move(pos); // 从开始 m_pRecordset->PutCollect((const _variant_t)str, data); m_pRecordset->Update(); } catch(_com_error *e) { MessageBox(e->ErrorMessage()); } } void CMyAdo::DeleteDataSheet(void) { /* 删除记录和上面修改记录的操作类似,先将记录指针移动到要修改记录的位置, 直接用Delete()方法删除它并用Update()来更新数据库既可。 */ try { // 假设删除第二条记录 m_pRecordset->MoveFirst(); m_pRecordset->Move(1); // 从开始 m_pRecordset->Delete(adAffectCurrent); // 参数adAffectCurrent为删除当前记录 m_pRecordset->Update(); } catch(_com_error *e) { MessageBox(e->ErrorMessage()); } } void CMyAdo::CloseDataSheet(void) { /* 关闭记录集。直接用Close方法关闭记录集并赋于其空值。 */ if (m_pRecordset) { m_pRecordset->Close(); m_pRecordset = NULL; } } BEGIN_MESSAGE_MAP(CMyAdo, CDialog) END_MESSAGE_MAP() // CMyAdo 消息处理程序 3、MyTest.mdp 为用access2003建立的一个数据库