使用ADO封裝類的資料庫程式開發執行個體[第二版] (上zz)

來源:互聯網
上載者:User
從上次在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問題,或著作權問題對您造成的損失負任何責任。
由於初次封裝如此多又不是很熟悉的東西,有什麼不當之處還請大家多指教.

本文代碼運行如下:
 http://www.vckbase.com/document/journal/vckbase21/images/MyAdo21.gif

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

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);

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

使用ADO封裝類的資料庫程式開發執行個體[第二版] (下)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.