步骤1:
在StdAfx.h的#include语句之后添加
#import "C:Program FilesCommon FilesSystemadomsado15.dll" no_namespace rename("EOF","adoEOF")
步骤2:
添加文件ADOConn.h
// ADOConn.h: interface for the ADOConn class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_ADOCONN_H__5FB9A9B2_8D94_44F7_A2DA_1F37A4F33D10__INCLUDED_) #define AFX_ADOCONN_H__5FB9A9B2_8D94_44F7_A2DA_1F37A4F33D10__INCLUDED_ #include <icrsint.h> #import "C:Program FilesCommon FilesSystemadomsado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF") #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class ADOConn { public: _ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset; public: _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL); ADOConn(); virtual ~ADOConn(); void OnInitADOConn(); BOOL ExecuteSQL(_bstr_t bstrSQL); void ExitConnect(); }; #endif // !defined(AFX_ADOCONN_H__5FB9A9B2_8D94_44F7_A2DA_1F37A4F33D10__INCLUDED_)
步骤3:
添加文件ADOConn.cpp
// ADOConn.cpp: implementation of the ADOConn class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" //#include "SuperMarket.h" #include "ADOConn.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// ADOConn::ADOConn() { } ADOConn::~ADOConn() { } void ADOConn::OnInitADOConn() { ::CoInitialize(NULL);// 此句很重要,不要遗漏 try { m_pConnection.CreateInstance("ADODB.Connection"); CString path = AfxGetApp()->m_lpCmdLine; if (path.IsEmpty()) { m_pConnection->Open(_bstr_t(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=fctest.mdb;Persist Security Info=False")),"","",adOpenUnspecified); } else { int pos = path.ReverseFind('\'); path = path.Left(pos); //注:fctest.mdb是我的本地数据库名 CString mdbPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ path +"\fctest.mdb;Persist Security Info=False"; m_pConnection->Open((_bstr_t)mdbPath,"","",adOpenUnspecified); } } catch(_com_error e) { AfxMessageBox(e.Description()); return; } } //执行SQL语句 BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL) { try { if(m_pConnection==NULL) OnInitADOConn(); m_pConnection->Execute(bstrSQL,NULL,adCmdText); return TRUE; } catch(_com_error e) { // e.Description(); AfxMessageBox(e.Description()); return FALSE; } } //取消和数据库的链接 void ADOConn::ExitConnect() { if(m_pRecordset != NULL) m_pRecordset->Close(); m_pConnection->Close(); ::CoUninitialize();// 此句很重要,不要遗漏 } //读取数据集 _RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL) { try { if(m_pConnection==NULL) OnInitADOConn(); m_pRecordset.CreateInstance(__uuidof(Recordset)); m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); } catch(_com_error e) { e.Description(); } return m_pRecordset; }
使用方法:
dialog中有IDC_LIST1的list。
查询:
ADOConn ado; ado.OnInitADOConn(); CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST1); pListCtrl->DeleteAllItems(); int n = 0; CString sql; sql.Format("select * from test where id > 0"); ado.m_pRecordset = ado.GetRecordSet((_bstr_t)sql);//读取数据集 while(!ado.m_pRecordset->adoEOF) { CString i1,i2,i3,i4; i1 = (char*)(_bstr_t)ado.m_pRecordset->GetCollect("id"); i2 = (char*)(_bstr_t)ado.m_pRecordset->GetCollect("name"); i3 = (char*)(_bstr_t)ado.m_pRecordset->GetCollect("age"); i4 = (char*)(_bstr_t)ado.m_pRecordset->GetCollect("zhiye"); pListCtrl->InsertItem(n,i1); pListCtrl->SetItemText(n,1,i2); pListCtrl->SetItemText(n,2,i3); pListCtrl->SetItemText(n,3,i4); n++; ado.m_pRecordset->MoveNext(); } ado.ExitConnect();
增加:
ADOConn ado; ado.OnInitADOConn(); CString sql; sql.Format("insert into test(id,name,age,zhiye) values (%d,'%s',%d,'%s')",5,"老潘",23,"打手"); ado.ExecuteSQL((_bstr_t)sql); ado.ExitConnect();
删除:
ADOConn ado; ado.OnInitADOConn(); CString sql; sql.Format("delete from test where id = 5"); ado.ExecuteSQL((_bstr_t)sql); ado.ExitConnect();
修改:
ADOConn ado; ado.OnInitADOConn(); CString sql; sql.Format("update test set name = '%s' where name = '%s' ","潘把子","老潘"); ado.ExecuteSQL((_bstr_t)sql); ado.ExitConnect();
常见问题:
1.win7下编译,xp下不能使用,会报错
解决办法:注意到代码里有
#import "C:Program FilesCommon FilesSystemadomsado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")
实际上win7和win xp的msado15.dll是不一样的,向下兼容,并且看到有人说win xp下的msado15.dll也不尽相同。如果想在win7下编译,并且能在xp下运行,可以拷贝
win XP中C:Program FilesCommon FilesSystem路径下的ado文件夹到win7相同路径下(注意保存原来的win7 ado文件夹),这样在win7下编译的程序在win xp下也可以运行。win7 及 win XP下的ado文件夹见附件。
2.初始化失败,调试时发现_ConnectionPtr 指针为空
原因:当时没有加::CoInitialize(NULL);及::CoUninitialize();语句。
示例源码下载:
链接: https://pan.baidu.com/s/1cde7h0 密码: 1xu8
xp ADO下载:
链接: https://pan.baidu.com/s/1sljv6ax 密码: pcn9
win7 ADO下载:
链接: https://pan.baidu.com/s/1cbI4t4 密码: ne39