程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 使用ADO封裝類的數據庫程序開發實例(上)

使用ADO封裝類的數據庫程序開發實例(上)

編輯:關於VC++

源代碼運行效果圖如下:

一、前言

用過ADO的人都知道, 調用ADO要處理很多"麻煩"的事情,如異常處理等,要寫很多try - catch塊. 有點不甚其煩。我干脆把常用的函數都封裝起來,免去老是要寫try - catch塊的麻煩。做起來雖然沒有什麼技術含量,但也比較煩瑣,所以只完成了一部分,且由於時間及個人水平有限,沒有對封裝的東西作全面測試,並必定有很多錯誤,但想到對某些朋友可能有用。所以先"捐"出來了。^-^.

在介紹這兩個類之前,讓我們先來了解一下ADO,本文假設你已有一定的編程能力:

二、了解ADO的結構體系

ADO(ActiveX Data Object, Active 數據對象)是Microsoft提供的一種面向對象,與語言無關的數據訪問應用編程接口。據大部分資料介紹,它有如下主要特點:

一:易於使用。

二:可以訪問多種數據源。

三:訪問速度快,效率高:

四:方便Web應用。

五:技術編程接口豐富。

六:低內存支出和占用磁盤空間較少.

正是看到ADO這麼多優點,使我對用ADO開發數據庫產生了興趣.ADO用起來也如前面所說的一樣,確實不難。總的來說,ADO模型包括了下列對象:連接(Connection)、命令 (Command)、記錄集 (Recordset)、字段 (Field)、參數 (Parameter)、錯誤 (Error)、屬性 (Property)、集合 、事件.它們之間的關系如下圖:

(1)我們最常用的主要是Connection、Recordset及Command這三個對象.

(2)對於訪問一個數據庫來說,我們一般先建立一個ADO連接.

(3)ADO連接可以直接執行SQL語句來操縱數據庫,但如果我們要對數據在應用程序和數據源之間進行存取的話,就需要用到記錄集對象。一個ADO連接可以有多個ADO連接,但一個ADO連接一般只能對應一個且必須對應一個ADO連接.

(4)另外如果你可進行更高級別的訪問的話,還可能要用到命令對象。例如要調用存儲過程等。

(5)一個記錄集包含有一個字段集,一個字段集則包含有多個字段對象。

(6)同樣一個命令對象也包含一個參數集,一個參數集則包含有多個參數對象。

(7)連接對象也有一個錯誤集並包含有多個錯誤對象。

這就是ADO各對象之間大致的關系.

三、了解ADO連接

在使用數據庫之前,要先建立連接.一般先用CreateInstance方法創建ADO連接對象,然後就可以用Open方法連接到數據庫。它的原型是 Open(BSTR ConnectionString, BSTR UserID, BSTR Password, long Options);其中UserID和Password如果在ConnectionString已經指明了用戶名和密碼,一般就可以不必管它們.Options指的是是以同步方式(adConnectUnspecified)還是以異步方式(adAsyncConnect)進行連接,默認為同步.這個函數的關鍵這處在於ConnectionString參數,它決定了我們將以什麼方式連接到什麼數據源,例如:

如果是Access數據庫,它的格式則一般為: "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb";

如果是SQL Server: "Provider=SQLOLEDB.1;Data Source=sqlservername;Initial Catalog=master;UserID=sa; PWD=password";

具體的內容視你的環境而定.要連接到其他數據庫,請參考相關的資料.

例如:

_ConnectionPtr pConnection;
LPCSTR strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb";
//創建 Connection 對象---------------------------
HRESULT hr = pConnection.CreateInstance("ADODB.Connection");
//設置連接時間-----------------------------------
pConnection->put_ConnectionTimeout(long(5));
if (SUCCEEDED(hr))
{
  // 連接數據庫---------------------------------------------
  pConnection->Open(strConnect, "", "", adConnectUnspecified))
}

四、了解ADO記錄集

創建了ADO連接,我們就可以通過ADO記錄集來訪問數據庫了.同樣,在使用記錄集之前要先創建對象.然後調用Open方法打開記錄集.它不但可以執行普通的SQL語句,還可以調用存儲過程等等:

Open(VARIANT Source, VARIANT ActiveConnection, CursorTypeEnum CursorType,LockTypeEnum LockType, LONG Options).

其中ActiveConnection參數為一個有效的 Connection 對象名,就是我們在上面所說過的ADO連接對象.

CursorType參數指的是記錄集光標類型,在官方的資料中是這樣說明它的取值類型的:

1.adOpenForwardOnly 僅向前游標,默認值。除了只能在記錄中向前滾動外,與靜態游標相同。當只需要在記錄集中單向移動時,使用它可提高性能。

2.adOpenKeyset 鍵集游標。盡管從您的記錄集不能訪問其他用戶刪除的記錄,但除無法查看其他用戶添加的記錄外,鍵集游標與動態游標相似。仍然可以看見其他用戶更改的數據。

3.adOpenDynamic 動態游標。可以看見其他用戶所作的添加、更改和刪除。允許在記錄集中進行所有類型的移動,但不包括提供者不支持的書簽操作。

4.adOpenStatic 靜態游標。可以用來查找數據或生成報告的記錄集合的靜態副本。另外,對其他用戶所作的添加、更改或刪除不可見。

我們現在可不用管這麼多,就用默認的adOpenStatic類型吧.

LockType參數,用於指示在什麼時候鎖定記錄:

AdLockReadOnly (默認值)只讀 - 不能改變數據。

AdLockPessimistic 保守式鎖定(逐個) - 提供者完成確保成功編輯記錄所需的工作,通常通過在編輯時立即鎖定數據源的記錄。

AdLockOptimistic 開放式鎖定(逐個) - 提供者使用開放式鎖定,只在調用Update 方法時才鎖定記錄。

AdLockBatchOptimistic 開放式批更新-用於批更新模式(與立即更新模式相對)。

Options參數指的是操作類型:

adCmdText 指示strSQL為命令文本, 即普通的SQL語句.

adCmdTable 指示ADO生成SQL查詢以便從在strSQL中命名的表中返回所有行.

adCmdTableDirect 指示所作的更改在strSQL中命名的表中返回所有行.

adCmdStoredProc 指示strSQL為存儲過程.

adCmdUnknown 指示strSQL參數中的命令類型為未知

adCmdFile 指示應從在strSQL中命名的文件中恢復保留(保存的)Recordset.

adAsyncExecute 指示應異步執行strSQL.

adAsyncFetch 指示在提取 Initial Fetch Size 屬性中指定的初始數量後,應該異步提取所有剩余的行.如果所需的行尚未提取,主要的線程將被堵塞直到行重新可用.

adAsyncFetchNonBlocking 指示主要線程在提取期間從未堵塞. 如果所請求的行尚未提取,當前行自動移到文件末尾.

唉又是一大串,如果你只是要執行SQL語句,就把它設為adCmdText吧. 這樣Source就是你要執行的SQL語句了.

例如:

LPCSTR strSQL = "select * from vckbasetable";
_RecordsetPtr pRecordset;
pRecordset.CreateInstance("ADODB.Recordset");
pRecordset->Open(_bstr_t(strSQL),
  _variant_t((IDispatch*)pConnection, true),
  adOpenStatic,
  AdLockOptimistic ,
  adCmdText);

ADO中讀取記錄集中指定字段的值一般有兩種方法:

第一種:

FieldsPtr pFields;
pRecordset->get_Fields(&pFields);
pFields->Item[L"COLUMN_NAME"]->Value;
//或pFields->Item[long(index)]->Value;
//其中index為整型或長整型.GetFields()函數返回的是記錄集對象的字段集合對象的指針.
第二種:pRecordset->get_Collect("COLUMN_NAME");
//或pRecordset->get_Collect(long(index));

它們都將返回一個_variant_t類型的值,推薦使用後一種方法.

例如:

int ncol = rset.GetFieldsCount();
while (!rset.IsEOF())
{
  for (int i = 0; i < ncol; i++)
  {
    rset.GetValueString(value, (long)(i));
  }
  rset.MoveNext();
}

四、了解ADO字段.

一個記錄集通常包含多個字段,通過訪問記錄,我們可以得到很多有用的信息,如字段名,字段的數據類型,定義的寬度,實際占有的寬度等等:

一般用記錄集的get_Fields方法取得字段集合對象:

FieldsPtr pFields;
Recordset->get_Fields(&pFields);

然後可以獲得相應的字段對象:

long lIndex = 0;
FieldPtr pf = pFields->GetItem(_variant_t(lIndex));
//或: FieldPtr pf = pFields->GetItem("COLUMN_NAME");

字段對象有很多有用的屬性,這些可以參考我的源代碼或其他相關資料.如:

get_ActualSize(long *pl) //實際寬度
get_Attributes(long *pl) //屬性
get_DefinedSize(long *pl) //定義寬度(以字節為單位,如整型為4,長整型為8...)
get_Name(BSTR *pbstr)   //字段名
get_Type(DataTypeEnum *pDataType) //數據類型
get_Value(VARIANT *pvar) // 字段的值

有了以上對ADO的基本了解後,我們將正式開始編寫應用程序,請看下文。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved