熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ADO第一次親密接觸 -- ADO開發實踐

2013-11-13 10:28:50  來源: .NET編程 

  ADO簡介
  
  ADO(ActiveX Data Object)是Microsoft數據庫應用程序開發的新接口是建立在OLE DB之上的高層數據庫訪問技術請不必為此擔心即使你對OLE DBCOM不了解也能輕松對付ADO因為它非常簡單易用甚至比你以往所接觸的ODBC APIDAORDO都要容易使用並不失靈活性本文將詳細地介紹在VC下如何使用ADO來進行數據庫應用程序開發並給出示例代碼
  
  本文示例代碼
  
  基本流程
  
  萬事開頭難任何一種新技術對於初學者來說最重要的還是入門掌握其要點讓我們來看看ADO數據庫開發的基本流程吧!
  
  ()初始化COM庫引入ADO庫定義文件
  
  ()用Connection對象連接數據庫
  
  ()利用建立好的連接通過ConnectionCommand對象執行SQL命令或利用Recordset對象取得結果記錄集進行查詢處理
  
  ()使用完畢後關閉連接釋放對象
  
  准備工作:
  
  為了大家都能測試本文提供的例子我們采用Access數據庫您也可以直接在我們提供的示例代碼中找到這個testmdb
  下面我們將詳細介紹上述步驟並給出相關代碼
  
  【】COM庫的初始化
  
  我們可以使用AfxOleInit()來初始化COM庫這項工作通常在CWinApp::InitInstance()的重載函數中完成請看如下代碼:
  
  BOOL CADOTestApp::InitInstance()
  {
  AfxOleInit();
  
  
  【】用#import指令引入ADO類型庫
  
  我們在stdafxh中加入如下語句(stdafxh這個文件哪裡可以找到?你可以在FileView中的Header Files裡找到)
  #import c:\program files\common files\system\ado\msadodll no_namespace rename(EOFadoEOF)
  這一語句有何作用呢?其最終作用同我們熟悉的#include類似編譯的時候系統會為我們生成msadotlhadotli兩個C++頭文件來定義ADO庫
  
  幾點說明:
  
  () 您的環境中msadodll不一定在這個目錄下請按實際情況修改
  
  () 在編譯的時候肯能會出現如下警告對此微軟在MSDN中作了說明並建議我們不要理會這個警告
  msadotlh() : warning C: unary minus operator applied to unsigned type result still unsigned
  
  【】創建Connection對象並連接數據庫
  
  首先我們需要添加一個指向Connection對象的指針:
  _ConnectionPtr m_pConnection;
  下面的代碼演示了如何創建Connection對象實例及如何連接數據庫並進行異常捕捉
  
  BOOL CADOTestDlg::OnInitDialog()
  {
  CDialog::OnInitDialog();
  HRESULT hr;
  try
  {
  hr = m_pConnectionCreateInstance(ADODBConnection);///創建Connection對象
  if(SUCCEEDED(hr))
  {
  hr = m_pConnection>Open(Provider=MicrosoftJetOLEDB;Data Source=testmdbadModeUnknown);///連接數據庫
  ///上面一句中連接字串中的Provider是針對ACCESS環境的對於ACCESS需要改為:Provider=MicrosoftJetOLEDB; }
  }
  catch(_com_error e)///捕捉異常
  {
  CString errormessage;
  errormessageFormat(連接數據庫失敗!\r\n錯誤信息:%seErrorMessage());
  AfxMessageBox(errormessage);///顯示錯誤信息
  }
  
  在這段代碼中我們是通過Connection對象的Open方法來進行連接數據庫的下面是該方法的原型
  HRESULT Connection::Open ( _bstr_t ConnectionString _bstr_t UserID _bstr_t Password long Options )
  ConnectionString為連接字串UserID是用戶名 Password是登陸密碼Options是連接選項用於指定Connection對象對數據的更新許可權
  Options可以是如下幾個常量:
  adModeUnknown:缺省當前的許可權未設置
  adModeRead:只讀
  adModeWrite:只寫
  adModeReadWrite:可以讀寫
  adModeShareDenyRead:阻止其它Connection對象以讀權限打開連接
  adModeShareDenyWrite:阻止其它Connection對象以寫權限打開連接
  adModeShareExclusive:阻止其它Connection對象打開連接
  adModeShareDenyNone:允許其它程序或對象以任何權限建立連接
  
  我們給出一些常用的連接方式供大家參考:
  
  ()通過JET數據庫引擎對ACCESS數據庫的連接
  
  m_pConnection>Open(Provider=MicrosoftJetOLEDB;Data Source=C:\\testmdbadModeUnknown);
  
  ()通過DSN數據源對任何支持ODBC的數據庫進行連接:
  m_pConnection>Open(Data Source=adotest;UID=sa;PWD=;adModeUnknown);
  
  ()不通過DSN對SQL SERVER數據庫進行連接 m_pConnection>Open(driver={SQL Server};Server=;DATABASE=vckbase;UID=sa;PWD=adModeUnknown);
  
  其中Server是SQL服務器的名稱DATABASE是庫的名稱
  
  Connection對象除Open方法外還有許多方法我們先介紹Connection對象中兩個有用的屬性ConnectionTimeOut與State
  ConnectionTimeOut用來設置連接的超時時間需要在Open之前調用例如: m_pConnection>ConnectionTimeout = ;///設置超時時間為
  m_pConnection>Open(Data Source=adotest;adModeUnknown);
  
  State屬性指明當前Connection對象的狀態表示關閉表示已經打開我們可以通過讀取這個屬性來作相應的處理例如:
  if(m_pConnection>State)
  m_pConnection>Close(); ///如果已經打開了連接則關閉它
  
  【】執行SQL命令並取得結果記錄集
  
  為了取得結果記錄集我們定義一個指向Recordset對象的指針:_RecordsetPtr m_pRecordset;
  並為其創建Recordset對象的實例: m_pRecordsetCreateInstance(ADODBRecordset);
  
  SQL命令的執行可以采用多種形式下面我們一進行闡述
  
  ()利用Connection對象的Execute方法執行SQL命令
  
  Execute方法的原型如下所示:
  _RecordsetPtr Connection::Execute ( _bstr_t CommandText VARIANT * RecordsAffected long Options ) 其中CommandText是命令字串通常是SQL命令參數RecordsAffected是操作完成後所影響的行數 參數Options表示CommandText中內容的類型Options可以取如下值之一
  adCmdText:表明CommandText是文本命令
  adCmdTable:表明CommandText是一個表名
  adCmdProc:表明CommandText是一個存儲過程
  adCmdUnknown:未知
  
  Execute執行完後返回一個指向記錄集的指針下面我們給出具體代碼並作說明  _variant_t RecordsAffected;
  ///執行SQL命令CREATE TABLE創建表格usersusers包含四個字段:整形ID字符串username整形old日期型birthday
  m_pConnection>Execute(CREATE TABLE users(ID INTEGERusername TEXTold INTEGERbirthday DATETIME)&RecordsAffectedadCmdText);
  ///往表格裡面添加記錄
  m_pConnection>Execute(INSERT INTO users(IDusernameoldbirthday) VALUES ( Washington//)&RecordsAffectedadCmdText);
  ///將所有記錄old字段的值加一
  m_pConnection>Execute(UPDATE users SET old = old+&RecordsAffectedadCmdText);
  ///執行SQL統計命令得到包含記錄條數的記錄集
  m_pRecordset = m_pConnection>Execute(SELECT COUNT(*) FROM users&RecordsAffectedadCmdText);
  _variant_t vIndex = (long);
  _variant_t vCount = m_pRecordset>GetCollect(vIndex);///取得第一個字段的值放入vCount變量
  m_pRecordset>Close();///關閉記錄集
  CString message;
  messageFormat(共有%d條記錄vCountlVal);
  AfxMessageBox(message);///顯示當前記錄條數
  
  ()利用Command對象來執行SQL命令
  
  _CommandPtr m_pCommand;
  m_pCommandCreateInstance(ADODBCommand);
  _variant_t vNULL;
  vNULLvt = VT_ERROR;
  vNULLscode = DISP_E_PARAMNOTFOUND;///定義為無參數
  m_pCommand>ActiveConnection = m_pConnection;///非常關鍵的一句將建立的連接賦值給它
  m_pCommand>CommandText = SELECT * FROM users;///命令字串
  m_pRecordset = m_pCommand>Execute(&vNULL&vNULLadCmdText);///執行命令取得記錄集
  
  在這段代碼中我們只是用Command對象來執行了SELECT查詢語句Command對象在進行存儲過程的調用中能真正體現它的作用下次我們將詳細介紹
  
  ()直接用Recordset對象進行查詢取得記錄集
  
  例如
  
  m_pRecordset>Open(SELECT * FROM users_variant_t((IDispatch *)m_pConnectiontrue)adOpenStaticadLockOptimisticadCmdText);
  
  Open方法的原型是這樣的:
  HRESULT Recordset::Open ( const _variant_t & Source const _variant_t & ActiveConnection enum CursorTypeEnum CursorType enum LockTypeEnum LockType long Options )
  
  其中
  
  ①Source是數據查詢字符串
  
  ②ActiveConnection是已經建立好的
From:http://tw.wingwit.com/Article/program/net/201311/13775.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.