日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

Visual C++編程封裝ADO類

出處:維庫電子市場網(wǎng) 發(fā)布于:2023-07-28 16:36:11

  摘 要:本文介紹了ADO訪問數(shù)據(jù)庫的基本過程,給出了一種在Visual C++下封裝ADO訪問數(shù)據(jù)庫類的方法。


  關鍵詞:封裝;ADO;Visual C


  1 引言

  在過去幾年中,微軟公司相繼推出了幾種數(shù)據(jù)訪問技術,先是DAO(Data Access Objects),然后是RDO(Remote Data Objects),現(xiàn)在是ADO(ActiceX Data Objects)。ADO是Microsoft數(shù)據(jù)庫應用程序開發(fā)的新接口,是微軟的數(shù)據(jù)訪問技術。它被設計用來同新的數(shù)據(jù)訪問層OLE DB Provider一起協(xié)同工作,以提供通用數(shù)據(jù)訪問(Universal Data Access)。ADO向我們提供了一個熟悉的,高層的對OLE DB的Automation封裝接口,它簡化了數(shù)據(jù)訪問的過程,增加了數(shù)據(jù)訪問的靈活性,是當前數(shù)據(jù)訪問接口的主流技術。


  用VB或者VBScript來操作ADO是非常方便的,但是如果使用C++或者是Java,就必須要處理類似Variants這樣的數(shù)據(jù)結構,從而實現(xiàn)和C++數(shù)據(jù)結構的轉換,而這種處理無疑是C++開發(fā)人員都很頭疼的事情。而且ADO是應用層的編程接口,它通過OLE DB提供的COM接口訪問數(shù)據(jù),使用ADO訪問數(shù)據(jù)庫需要使用許多API函數(shù)和ADO的對象,對于初學者來說,可能有些難度。即便對于ADO的編程高手,經(jīng)常要書寫大量相同的ADO冗余代碼,也會感到厭煩??催^網(wǎng)上不少紹封裝ADO的各種文章,也各有利弊。筆者在Visual C++下也嘗試封裝ADO訪問數(shù)據(jù)庫類,使其更方便地使用現(xiàn)有的VC的數(shù)據(jù)類型,簡化應用程序書寫的邏輯,增加程序的可讀性。達到了比較好的應用效果,本文將給出筆者所使用封裝方法和源程序。


  2 建立ADO封裝類
  2.1 ADO對象基本模型
  ADO模型包含了連接對象、命令對象、域對象、參數(shù)對象、記錄集對象、錯誤對象等。對象之間又具有層次關系。
  在VC中使用ADO訪問數(shù)據(jù)庫基本過程是:
  初始化COM庫,引入ADO庫文件
  用Connection對象連接數(shù)據(jù)庫
  利用建立好的連接,通過利用Recordset對象取得結果記錄集進行查詢、處理。
  使用完畢后關閉連接釋放對象

  2.2基本操作函數(shù)和數(shù)據(jù)結構


  封裝的ADO類應包括以下函數(shù)和數(shù)據(jù)結構:
  1)建立數(shù)據(jù)庫連接函數(shù)OpenDataBase()
  ADO連接數(shù)據(jù)庫首先要用到Connection對象,它是到數(shù)據(jù)庫的物理連接,管理著應用程序和數(shù)據(jù)庫之間的通訊。對于大多數(shù)的數(shù)據(jù)庫系統(tǒng),每一個物理連接都需要耗費大量系統(tǒng)內(nèi)存,是寶貴的系統(tǒng)資源,不可濫用??紤]到應用程序的效率,每一個數(shù)據(jù)庫客戶端都只用一個物理連接,并且應用程序結束后應該釋放。
  2)關閉數(shù)據(jù)庫連接函數(shù)CloseDataBase()
  3)SQL查詢語句函數(shù) Select()
  記錄集的建立和查詢結果得獲取是影響應用程序得效率得關鍵問題。由于每查詢結果都可能不一樣,所以每個查詢語句都要建立一個記錄集對象。
  4)執(zhí)行無返回結果的SQL語句函數(shù)Excute()
  5)查詢結果數(shù)組pData
  為了數(shù)據(jù)類型轉換的方便,我們將記錄集數(shù)據(jù)類型都轉換為CSTring類型,存放在查詢結果數(shù)組pData中,由于C++的CString是一個高效和功能強大的類,我們可以很方便地讀取記錄集中的查詢結果。

  6)結果數(shù)組大小nResultRow和nResultCol


  2.3 ADO封裝類頭文件
  封裝類頭文件ADODB.H定義如下:
  class CADODB : public CObject
  {
  public:
  CADODB(); //構造函數(shù)
  ~CADODB(); //析構函數(shù)
  public:
  int nResultRow; //查詢結果行數(shù)
  int nResultCol; //查詢結果列數(shù)
  CStringArray pData; //存放查詢結果數(shù)組 大小為nRow*nCol
  CString errormessage; //ADO錯誤信息
  bool OpenDataBase(CString DsnName,CString sUserID,CString sPassword);
  //打開數(shù)據(jù)庫連接 輸入DSN名稱、用戶ID和密碼
  int Select(CString Sql); //執(zhí)行SQL查詢語句,結果放在數(shù)組pData中
  int Excute(CString Sql); //執(zhí)行無返回值得SQL語句
  bool CloseDataBase(); //關閉數(shù)據(jù)庫連接
  protected:
  _ConnectionPtr m_pConnection; //定義連接指針

  };


  2.4 封裝類實現(xiàn)文件
  封裝類實現(xiàn)文件ADODB.CPP如下:
  #include "stdafx.h"
  #include "ADODB.h"
  CADODB::CADODB() //構造函數(shù),完成初始化
  {
  nResultRow=0; //
  nResultCol=0; //記錄集行數(shù)和列數(shù)
  m_pConnection = NULL;
  }
  CADODB::~CADODB() //關閉數(shù)據(jù)庫物理連接
  {
  if(m_pConnection )m_pConnection->Close();
  m_pConnection = NULL;
  }
  bool CADODB::OpenDataBase(CString DsnName,CString sUserID,CString sPassword)
  { //打開數(shù)據(jù)庫連接
  …
  HRESULT hr=m_pConnection.CreateInstance("ADODB.Connection");//創(chuàng)建連接對象
  hr=m_pConnection->Open((_bstr_t)DsnName,(_bstr_t)sUserID,(_bstr_t)sPassword,adOpenUnspecified); //連接數(shù)據(jù)庫
  …
  }
  int CADODB::Select(CString SqlStr) //SQL查詢語句函數(shù)
  { …
  try
  {
  hr = m_pRecordset.CreateInstance("ADODB.Recordset");//創(chuàng)建紀錄集對象實例
  hr = m_pRecordset->putref_ActiveConnection(m_pConnection);//設置連接對象
  hr=m_pRecordset->Open(vSqlString,vNull,adOpenDynamic,adLockOptimistic,adCmdText); //打開紀錄集
  nResultCol = m_pRecordset->Fields->GetCount();//獲得紀錄集總列數(shù)
  while(!m_pRecordset->adoEOF)
  {
  for (j = 0; j < nResultCol; j++) //取一列數(shù)據(jù)
  {
  vValue = m_pRecordset->Fields->Item[(long)j]->Value;//取得當前記錄字段數(shù)據(jù)
  if(vValue.vt != 1) //數(shù)據(jù)非空
  {
  int type = vValue.vt;
  if(VariantChangeType(&vValue1, &vValue, 0, VT_BSTR) == S_OK) //轉換數(shù)據(jù)類型(為字符串)
  str=vValue1.bstrVal; //保存結果值到臨時變量str中
  }
  if(pData.GetSize()m_pResult.SetSize(i*nResultCol+j+1);
  pData[i*nResultCol+j]=str; //保存結果到數(shù)組中
  m_pRecordset->MoveNext(); //移動記錄集指針到下一行
  i++;
  }
  m_pRecordset->Close();
  m_pRecordset=NULL;
  nResultRow=i;
  }
  catch(_com_error e)///捕捉異常
  {
  …
  }
  pData->FreeExtra();//釋放多余的內(nèi)存空間
  return nResultRow;
  }

  …


  3 使用ADO封裝類
  建立了ADO封裝類后,使用數(shù)據(jù)庫操作就非常簡單了。在需使用數(shù)據(jù)庫查詢的CPP文件中包含ADO封裝類頭文件"ADODB.H",然后定義一個CADODB類指針;接下來就是打開數(shù)據(jù)庫連接。使用封裝類的成員函數(shù)OpenDataBase(…),輸入要連接的數(shù)據(jù)庫的DSN名稱、用戶名和密碼,就與數(shù)據(jù)庫建立連接了。要注意的是如果同時連接多個數(shù)據(jù)庫就要聲明多個CADODB對象指針,保證數(shù)據(jù)庫連接對象是全局且惟一。接下來就是,調(diào)用成員函數(shù)Select取得數(shù)據(jù)庫查詢結果,執(zhí)行完畢后查詢結果放在CADODB的成員字符數(shù)組指針pData中,數(shù)組大小可以從成員變量nResultRow和nResultCol中得出?;静襟E如下:
  在"stdafx.h"中加入ADO庫的導入語句
  #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
  在應用程序類中初始化COM對象,在InitInstance()中加入以下語句
  AfxOleInit();
  加入封裝類的聲明文件
  #include "ADODB.H"
  …
  定義封裝類對象
  CADODB ADO1; //連接數(shù)據(jù)庫1
  CADODB ADO2; //連接數(shù)據(jù)庫2
  …
  ADO1.OpenDataBase("數(shù)據(jù)源名稱","用戶ID","用戶密碼") //建立連接,次連接時調(diào)用
  ADO1.Select("select * from 表名"); //執(zhí)行SQL查詢語句
  int nRow= ADO1.GetResultRow(); //取得記錄行數(shù)
  int nCol= ADO1.GetResultCol(); //取得記錄列數(shù)
  for(i=0;ifor(j=0;jprintf("第%d行第%d列的值是%s",i,j,ADO1.pData[i*nCol+j];
  …

  ADO1.CloseDataBase(); //使用完后關閉數(shù)據(jù)庫連接


  4 結論和建議
  使用封裝ADO類后,在應用程序中操作數(shù)據(jù)庫的過程就變得簡單了,針對一般的數(shù)據(jù)庫應用程序,而且在數(shù)據(jù)量不很大的情況下,本封裝類已經(jīng)能夠應付,在使用效率上也比較滿意。但是該封裝沒有考慮數(shù)據(jù)訪問的優(yōu)化處理,數(shù)據(jù)庫使用了動態(tài)連接方式,記錄集也沒有進行分頁處理,ADO緩沖區(qū)大小和游標類型都采用缺省設置,這些在實際使用中都可能降低封裝類的性能,讀者可以根據(jù)不同的應用情況有針對地進行修改。

關鍵詞:Visual C++編程封裝ADO類ITEM  SELECTAUTOMATIONCOMMONREMOTE

版權與免責聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權均屬于維庫電子市場網(wǎng),轉載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關法律責任。

本網(wǎng)轉載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉載時,必須保留本網(wǎng)注明的作品出處,并自負版權等法律責任。

如涉及作品內(nèi)容、版權等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關權利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務:
賣家服務:
技術客服:

0571-85317607

網(wǎng)站技術支持

13606545031

客服在線時間周一至周五
9:00-17:30

關注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!