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

使用ADO封裝類的數據庫程序開發實例[第二版](上)

編輯:關於VC++

從上次在VC知識庫發表《使用ADO封裝類的數據庫程序開發實例》一文後,得到許多網友的響應,甚覺欣慰。但由於我對ADO也非完全精通,所以上次寫的類很不完美,甚至可能給某些朋友帶來麻煩,因此一直想把它寫得更完善一點。

現在寫的這個類功能應該說比較完善了,基本上封裝了ADO組件的大部分方法,並擴展了一些人們常用到的方法,如把文件或圖片寫到數據庫中,從數據庫中讀出位圖字段,字段的值的智能轉換等等。

因為實在是時間不夠,我幾乎沒有對command類做任何有效的測試,也沒有寫相關的文檔,而對connection和recordset類的文檔,也寫得不甚明了,也許有人又要說我很不負責任了。呵呵!

在這個測試程序中,我對連接類和記錄集類的大部分方法進行了測試,包括對常用數據類型的存取,添加刪除等等,還有對多種數據類型以整型,雙精度型,字符型類型的變量讀取,其中以字符型兼容性最好,基本上對大部分數據都能返回有效值,其次是雙精度型,和整型,它們不能讀取字符型,日期型等字段的值. 另外對這兩個象的屬性進行了一些測試,當然有好多屬性是沒法全面測試得到的。

我在開發ADO相關程序中切身體會到有幾個方法是很有用的方法,如SetFilter,SetSort,Find,書簽等等,它們可以讓你很有效的操縱記錄,而不用老去想怎樣去構建SQL語句來實現這樣功能。

其中還有一個導入導出xml文件的方法,我不知道這個方法是不是很有用,因為它對中文支持不是很好,導出的xml文件中沒法正常顯示中文.

最後還一個就是datagrid控件與記錄集綁定,我覺得這應該是一個比較有用的技巧,我以前都沒想到過,在VC中也可以學VB一樣綁定數據庫的,這樣不用寫什麼代碼就可以方便地修改數據了。

代碼在(vc6 + sp5) / vc7 + windows XP 英文專業版/ windows 2000 中文專業版/ windows 2003 英文測試版 /windows 2003 中文企業版下編譯通過, 並在access, sqlserver, mysql下進行了測試,除mysql不支持事務等方法外,大部分方法都可以通過測試.

在原則上,我默許您自由地使用,修改,或傳播此代碼,但您要是用在某某項目中或用於商業用途,那請您注意了,我不會對因代碼bug問題,或版權問題對您造成的損失負任何責任。

由於初次封裝如此多又不是很熟悉的東西,有什麼不當之處還請大家多指教.

本文代碼運行效果圖如下:

下面詳細介紹這幾個封裝類:

CAdoConnection class

類成員:

構造函數: CAdoConnection()

創建Connection對象.

Open 方法:

BOOL CAdoConnection::Open(LPCTSTR lpszConnect, long lOptions)

連接到數據源.

Params:

[lpszConnect]: 連接字符串, 包含連接信息.

[lOptions]: 可選. 決定該方法是以同步還是異步的方式連接數據源. 可以是如下某個常量: [常量] [說明] adConnectUnspecified (默認)同步方式打開連接. adAsyncConnect 異步方式打開連接.

Ado用 ConnectComplete 事件來通知已經完成連接.

BOOL CAdoConnection::ConnectSQLServer(CString dbsrc, CString dbname, CString user, CString pass, long lOptions)

連接到 SQL Server 數據庫.

BOOL CAdoConnection::ConnectAccess(CString dbpath, CString pass, long lOptions)

連接到 Access 數據庫.

Params:

[dbpath]: Access MDB 數據庫文件路徑名.

[pass]: 訪問密碼.

[dbsrc]: SQL SERVER 服務器名.

[dbname]: 默認的數據庫名.

[user]: 用戶名.

OpenUDLFile方法:

BOOL CAdoConnection::OpenUDLFile(LPCTSTR strFileName, long lOptions)

通過打開udl文件連接數據庫.

Params:

[strFileName]: UDL 數據庫連接文件路徑名.

// 訪問SQL Server 的例子:

CAdoConnection pAdoConnection;
CString strConnection = _T("Provider=SQLOLEDB.1;Persist Security Info=False;"
      "Integrated Security=SSPI;"
      "Data Source=cz\\xyy;Initial Catalog=NoteBook;");
if (pAdoConnection.Open(LPCTSTR(strConnection)))
{
  DoSomething();
}
...
或者:

if (pAdoConnection.ConnectSQLServer("cz\\xyy", "NoteBook", "sa", "007"))
{
  DoSomething();
}

//訪問 ACCESS 的例子:

CAdoConnection pAdoConnection;
CString strConnection = _T("Provider=Microsoft.Jet.OLEDB.4.0;"
        "Data Source=C:\\dbTest.mdb");
pAdoDb.SetConnectionString(strConnection);
if (pAdoConnection.Open(LPCTSTR(strConnection)))
{
  DoSomething();
}
...

或者:

if (pAdoConnection.ConnectAccess("C:\\dbTest.mdb", "007"))
{
  DoSomething();
}
...

Close 方法:

void CAdoConnection::Close()

關閉與數據源的連接.

Remarks: 使用 Close 方法可關閉 Connection 對象以便釋放所有關聯的系統資源. 關閉對象並非將它從內存中刪除, 可以更改它的屬性設置並且在此後再次打開. 在超出 Connection 對象作用域或重新連接新的數據庫時會自動調用此方法.

Execute 方法:

_RecordsetPtr CAdoConnection::Execute(LPCTSTR lpszSQL, long lOptions)

執行指定的查詢、SQL 語句、存儲過程等.

Remarks: 請參考 CAdoRecordSet 類的Open方法. 返回的 Recordset 對象始終為只讀、僅向前的游標. 連接對象的此方法一般用來執行一些不用返回記錄集的SQL語句. 不需要為了執行一條小語句而動用RecordSet對象,顯得更為靈活點.

如:

if (pAdoConnection.IsOpen())
{
  pAdoConnection.Execute("Delete From student Where number = 3");
}
Cancel 方法:

BOOL CAdoConnection::Cancel()

Remarks: 請參考 CAdoRecordSet 類 Cancel 方法.

GetLastErrorText 方法:

CString CAdoConnection::GetLastErrorText()

取得最後發生的錯誤信息.

Remarks: 任何涉及 ADO 對象的操作都可以產生一個或多個提供者錯誤. 產生錯誤時,可以將一個或多個 Error 對象置於 Connection 對象的 Errors 集合中. 其他 ADO 操作產生錯誤時, 將清空 Errors 集合, 並且將新的 Error對象置於 Errors 集合中.每個 Error 對象代表特定的提供者錯誤, 而不是 ADO 錯誤. ADO 錯誤被記載在運行時的異常處理機制中.沒有產生錯誤的 ADO 操作對 Errors 集合沒有影響. 使用 Clear 方式可手工清除 Errors 集合.

ErrorsPtr CAdoConnection::GetErrors()

獲得錯誤集對象指針.

ErrorPtr CAdoConnection::GetError(long index)

獲得錯誤對象指針.

IsOpen 屬性:

BOOL CAdoConnection::IsOpen()

檢測連接對象是否為打開狀態.

ConnectTimeOut 屬性:

BOOL CAdoConnection::SetConnectTimeOut(long lTime)

long CAdoConnection::GetConnectTimeOut()

設置或取得連接超時時間.

ProviderName 屬性:

CString CAdoConnection::GetProviderName()

取得 Connection 對象提供者的名稱.

Version 屬性:

CString CAdoConnection::GetVersion()

取得當前使用的 ADO 的版本號

State 屬性:

long CAdoConnection::GetState()

取得對象的狀態(同 Recordset 對象的 GetState 方法).

returns: 返回下列常量之一的長整型值(連接對象一般為下面兩種狀態之一).

[常量] [說明] adStateClosed 指示對象是關閉的. adStateOpen 指示對象是打開的.

Remarks: 可以隨時使用 State 屬性取得指定對象的當前狀態.

Mode 屬性:

ConnectModeEnum CAdoConnection::GetMode()

BOOL CAdoConnection::SetMode(ConnectModeEnum mode)

設置或取得在 Connection 對象中修改數據的可用權限.

returns: 返回以下某個 ConnectModeEnum 的值.

[常量] [說明] adModeUnknown 默認值. 表明權限尚未設置或無法確定. adModeRead 表明權限為只讀. adModeWrite 表明權限為只寫. adModeReadWrite 表明權限為讀/寫. adModeShareDenyRead 防止其他用戶使用讀權限打開連接. adModeShareDenyWrite 防止其他用戶使用寫權限打開連接. adModeShareExclusive 防止其他用戶打開連接. adModeShareDenyNone 防止其他用戶使用任何權限打開連接.

Remarks: 使用 Mode 屬性可設置或返回當前連接上提供者正在使用的訪問權限. 只能在關閉 Connection 對象時方可設置 Mode 屬性.

OpenSchema 方法:

_RecordsetPtr CAdoConnection::OpenSchema(SchemaEnum QueryType)

從數據源獲取數據庫信息.

Params: [QueryType]: 所要運行的模式查詢類型, 下面列出一些較常用的類型及返回的表中多條字段中主要的字段名.

adSchemaAsserts CONSTRAINT_NAME adSchemaCatalogs CATALOG_NAME adSchemaCharacterSets CHARACTER_SET_NAME adSchemaCheckConstraints CONSTRAINT_NAME adSchemaCollations COLLATION_NAME adSchemaColumnDomainUsage DOMAIN_NAME   COLUMN_NAME adSchemaColumnPrivileges TABLE_NAME   COLUMN_NAME   GRANTOR   GRANTEE adSchemaColumns TABLE_NAME   COLUMN_NAME adSchemaConstraintColumnUsage TABLE_NAME   COLUMN_NAME adSchemaConstraintTableUsage TABLE_NAME adSchemaForeignKeys PK_TABLE_NAME   FK_TABLE_CATALOG   FK_TABLE_SCHEMA   FK_TABLE_NAME adSchemaIndexes INDEX_NAME   TYPE   TABLE_NAME adSchemaKeyColumnUsage CONSTRAINT_NAME   TABLE_CATALOG   TABLE_SCHEMA   TABLE_NAME   COLUMN_NAME adSchemaPrimaryKeys PK_TABLE_NAME adSchemaProcedureColumns PROCEDURE_NAME   COLUMN_NAME adSchemaProcedureParameters PROCEDURE_NAME   PARAMTER_NAME adSchemaProcedures PROCEDURE_NAME   PROCEDURE_TYPE adSchemaProviderSpecific 參見說明 adSchemaProviderTypes DATA_TYPE   BEST_MATCH adSchemaReferentialConstraints CONSTRAINT_NAME adSchemaSchemata SCHEMA_OWNER adSchemaSQLLanguages <無> adSchemaStatistics TABLE_NAME adSchemaTableConstraints CONSTRAINT_NAME   TABLE_CATALOG   TABLE_SCHEMA   TABLE_NAME   CONSTRAINT_TYPE adSchemaTablePrivileges TABLE_NAME   GRANTOR   GRANTEE adSchemaTables TABLE_NAME   TABLE_TYPE adSchemaTranslations TRANSLATION_NAME adSchemaUsagePrivileges OBJECT_NAME   OBJECT_TYPE   GRANTOR   GRANTEE adSchemaViewColumnUsage VIEW_NAME adSchemaViewTableUsage VIEW_NAME adSchemaViews VIEW_NAME

returns: 返回包含數據庫信息的 Recordset 對象. Recordset 將以只讀、靜態游標打開.

Remarks: OpenSchema方法返回與數據源有關的信息, 例如關於服務器上的表以及表中的列等信息, 上述數據僅供參考, 視具體的數據源可能會有不同.

Trans 相關方法:

long CAdoConnection::BeginTrans()

BOOL CAdoConnection::CommitTrans()

BOOL CAdoConnection::RollbackTrans()

BeginTrans - 開始新事務.

CommitTrans - 保存任何更改並結束當前事務.它也可能啟動新事務.

RollbackTrans - 取消當前事務中所作的任何更改並結束事務. 它也可能啟動新事務.

一旦調用了 BeginTrans 方法, 在調用 CommitTrans 或 RollbackTrans 結束事務之前, 數據庫將不再立即提交所作的任何更改.

對於支持嵌套事務的數據庫來說, 在已打開的事務中調用 BeginTrans 方法將開始新的嵌套事務. 返回值將指示嵌套層次: 返回值為 1 表示已打開頂層事務(即事務不被另一個事務所嵌套), 返回值為 2 表示已打開第二層事務(嵌套在頂層事務中的事務), 依次類推. 調用 CommitTrans 或 RollbackTrans 只影響最新打開的事務;在處理任何更高層事務之前必須關閉或回卷當前事務.

調用 CommitTrans 方法將保存連接上打開的事務中所做的更改並結束事務. 調用 RollbackTrans方法還原打開事務中所做的更改並結束事務. 在未打開事務時調用其中任何一種方法都將引發錯誤.

// 數值類型轉換 -----------------------------------
COleDateTime vartodate(const _variant_t& var);
COleCurrency vartocy(const _variant_t& var);
bool vartobool(const _variant_t& var);
BYTE vartoby(const _variant_t& var);
short vartoi(const _variant_t& var);
long vartol(const _variant_t& var);
double vartof(const _variant_t& var);
CString vartostr(const _variant_t& var);

把變體型變量轉換成其他類型變量.

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