行者的学习博客

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

vc中调用ado的方法

说明:
 ole DB是基于com技术的,而ado是ole DB之上的,ADO本身也是基于COM的。
 COM编程需要初始化,可以使用CoInitialize,使用完后可以用CoUninitialize释放。

一、在头文件中添加动态连接库文件msado15.dll的导入
 假设文件位置为:D:\Program Files\Common Files\System\ado\msado15.dll

 导入语句为:
 #import "D:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")

 说明:
 (1)重命名EOF为rsEOF是因为文件的结尾也为EOF,重命名后方便区分
 (2)导入并编译后可以在debug目录下发现两个文件:msado15.tlh;msado15.tli
 (3)将上述两个文件导入到工程文件中,msado15.tlh可以看作头文件,msado15.tli看作源文件。当然实际是不需要导入的,在此只是为了查看方便

 

二、实现方法
(1)方法一
 //初始化COM库(调用msado15.dll为COM库调用方式)
 CoInitialize(NULL);

 //利用_ConnectionPtr这个智能指针构造对象pConn,调用其中的Connection定义
 _ConnectionPtr pConn(__uuidof(Connection));
 _RecordsetPtr pRst(__uuidof(Recordset));

 //Microsoft Access数据库
 //pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\vc\LazyCat\data\dhcp.mdb;Persist Security Info=False";
 //连接字符串说明:Provider表示驱动引擎;Data Source表示数据库文件名及其完整路径;

 //SQL 数据库
 pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=;Initial Catalog=pubs";
 //连接字符串说明:Provider表示驱动引擎;User ID表示用户名;Password表示口令;Initial Catalog表示数据库名
 pConn->Open("","","",adConnectUnspecified);

 pRst=pConn->Execute("select * from authors",NULL,adCmdText);
 while(!pRst->rsEOF)
 {
  ((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("au_lname"));
  pRst->MoveNext();
 }
 
 pRst->Close();
 pConn->Close();
 pRst.Release();
 pConn.Release();

 //释放COM库
 CoUninitialize();

(2)方法二
 //初始化COM库(调用msado15.dll为COM库调用方式)
 CoInitialize(NULL);

 //利用_ConnectionPtr这个智能指针构造对象pConn,调用其中的Connection定义
 _ConnectionPtr pConn(__uuidof(Connection));
 _RecordsetPtr pRst(__uuidof(Recordset));

 ///Microsoft Access数据库
 //pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\vc\LazyCat\data\dhcp.mdb;Persist Security Info=False";
 //连接字符串说明:Provider表示驱动引擎;Data Source表示数据库文件名及其完整路径;

 //SQL 数据库
 pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=;Initial Catalog=pubs";
 //连接字符串说明:Provider表示驱动引擎;User ID表示用户名;Password表示口令;Initial Catalog表示数据库名
 pConn->Open("","","",adConnectUnspecified);

 pRst->Open("select * from authors",_variant_t((IDispatch*)pConn),adOpenDynamic,adLockOptimistic,adCmdText);

 while(!pRst->rsEOF)
 {
  ((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("au_lname"));
  pRst->MoveNext();
 }
 
 pRst->Close();
 pConn->Close();
 pRst.Release();
 pConn.Release();

 //释放COM库
 CoUninitialize();

(3)方法三
 //初始化COM库(调用msado15.dll为COM库调用方式)
 CoInitialize(NULL);

 //利用_ConnectionPtr这个智能指针构造对象pConn,调用其中的Connection定义
 _ConnectionPtr pConn(__uuidof(Connection));
 _RecordsetPtr pRst(__uuidof(Recordset));
 _CommandPtr pCmd(__uuidof(Command));

 //Microsoft Access数据库
 //pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\vc\LazyCat\data\dhcp.mdb;Persist Security Info=False";
 //连接字符串说明:Provider表示驱动引擎;Data Source表示数据库文件名及其完整路径;

 //SQL 数据库
 pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=;Initial Catalog=pubs";
 //连接字符串说明:Provider表示驱动引擎;User ID表示用户名;Password表示口令;Initial Catalog表示数据库名
 pConn->Open("","","",adConnectUnspecified);

 pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));
 pCmd->CommandText="select * from authors";
 pRst=pCmd->Execute(NULL,NULL,adCmdText);
 while(!pRst->rsEOF)
 {
  ((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("au_lname"));
  pRst->MoveNext();
 }
 
 pRst->Close();
 pConn->Close();
 pCmd.Release();
 pRst.Release();
 pConn.Release();

 //释放COM库
 CoUninitialize();

(4)方法四
 //定义
 _ConnectionPtr pConn;
 _RecordsetPtr pRst;

 //初始化COM库(调用msado15.dll为COM库调用方式)
 CoInitialize(NULL);

 //初始化pConn和pRst
 pConn.CreateInstance(__uuidof(Connection));
 pRst.CreateInstance(__uuidof(Recordset));

 //Microsoft Access数据库
 //pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\vc\LazyCat\data\dhcp.mdb;Persist Security Info=False";
 //连接字符串说明:Provider表示驱动引擎;Data Source表示数据库文件名及其完整路径;

 //SQL 数据库
 pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=;Initial Catalog=pubs";
 //连接字符串说明:Provider表示驱动引擎;User ID表示用户名;Password表示口令;Initial Catalog表示数据库名
 pConn->Open("","","",adConnectUnspecified);

 pRst=pConn->Execute("select * from authors",NULL,adCmdText);
 while(!pRst->rsEOF)
 {
  ((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("au_lname"));
  pRst->MoveNext();
 }
 
 pRst->Close();
 pConn->Close();
 pRst.Release();
 pConn.Release();

 //释放COM库
 CoUninitialize();

三、我实际使用方法
 (1)在应用类(MWRCCApp)中定义数据库连接对象m_pConnection。如:
 _ConnectionPtr m_pConnection;
 
 (2)在应用类(MWRCCApp)的InitInstance()函数中进行初始化。如:
 //初始化数据库
 AfxOleInit();///初始化COM库
 ////////////连接数据库//////////////
 HRESULT hr;
 try
 {
  hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
  if(SUCCEEDED(hr))
  {
   char sTemp[MAX_PATH];
   GetCurrentDirectory(sizeof(sTemp),sTemp);
   char sConn[1024];
   sprintf(sConn,"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s\\dhcp.mdb;Persist Security Info=False",sTemp);

   hr = m_pConnection->Open((_bstr_t)sConn,"","",adModeUnknown);///连接数据库
   ///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51;  }
  }
 }
 catch(_com_error e)///捕捉异常
 {
  CString errormessage;
  errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
  AfxMessageBox(errormessage);///显示错误信息
  return FALSE;
 }

 (3)在框架类(CMainFrame)中定义数据库记录对象。如:
 //增加ADODB数据库定义
 _RecordsetPtr m_pRecordset;

 (4)读取数据。如:
 CString sGroup,sNote,sSQL;

 sGroup="....";
 sSQL="select * from GroupStructure where GroupName='"+sGroup+"'";
 m_pRecordset.CreateInstance("ADODB.Recordset");
 m_pRecordset->Open((_bstr_t)sSQL,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); 
 sNote=((_variant_t)m_pRecordset->GetCollect("Note")).bstrVal;
 ......

 (5)新增记录。如:
 CString sGroupName,sFatherName, sNote,sID;
 _variant_t strGroupName,strFatherName,strNote,strID;

 strGroupName=sGroupName;
 strFatherName=sFatherName;
 strNote=sNote;
 strID.Format("%d",sID);

 CString sSQL="select * from GroupStructure where GroupName='"+sGroupName+"'";
 m_pRecordset.CreateInstance("ADODB.Recordset");
 m_pRecordset->Open((_bstr_t)sSQL,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);

 m_pRecordset->AddNew();
 m_pRecordset->PutCollect("GroupName",strGroupName);
 m_pRecordset->PutCollect("FatherName",strFatherName);
 m_pRecordset->PutCollect("Note",strNote);
 m_pRecordset->PutCollect("ID",strID);

 m_pRecordset->Update();
 m_pRecordset->Close();

 (6)修改记录。如:
 CString sGroupName,sFatherName, sNote;
 _variant_t strGroupName,strFatherName,strNote;

 strGroupName=sGroupName;
 strFatherName=sFatherName;
 strNote=sNote;

 CString sSQL="select * from GroupStructure where GroupName='"+sGroupName+"'";
 m_pRecordset.CreateInstance("ADODB.Recordset");
 m_pRecordset->Open((_bstr_t)sSQL,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);

 m_pRecordset->PutCollect("Note",strNote);

 m_pRecordset->Update();
 m_pRecordset->Close();

 

转自:http://blog.sina.com.cn/s/blog_5f3312e90100h626.html?retcode=0

posted on 2010-06-02 12:16  ylclass  阅读(3012)  评论(0编辑  收藏  举报