首先在StdAfx.h中加入
建立連接:(在xxApp文件中)
?1? 聲明變量?
???????
??? 2 建立連接
??????????
(1) AfxOleInit
?
初始化 OLE 為應用程序的支持。
BOOL AFXAPI AfxOleInit( );
?AfxOleInit()與CoInitialize(NULL)的區別
OLE是建立在COM之上的技術,層次比COM要高。AfxOleInit()調用的是OleInitialize(),而OleInitialize()除了調用CoInitializeEx()來初始化COM庫外,還進行一些其它的操作,這些操作對OLE應用來說是必須的,這些OLE應用包括:??
? (1)Clipboard;???
? (2)Drag?? and?? drop;???
? (3)Object?? linking?? and?? embedding(現在的OLE,已不再僅僅是Object?? linking?? and?? embedding的概念);??
? (4)In-place?? activation;???
? 與AfxOleInit()對應的是,AfxOleTerm()。???
??? CoInitialize和CoUninitialize必須成對使用,后者不必。
???? AfxOleInit()和AfxOleTerm()其實也是需要成對的,但是,在你的程序中,AfxOleTerm()可以不出現,這是因為,MFC已經幫你做好了(有興趣的話,你可以仔細研究一下CWinThread::m_lpfnOleTermOrFreeLib,而CWinApp是從CWinThread繼承的)。
(2)CreateInstance
_uuidof:??? 取得和某個標示符相關聯的GUID(全球唯一標識符)
(3)Open 方法 (ADO Connection)
打開到數據源的連接。
語法
connection.Open?ConnectionString,?UserID,?Password, Options
參數
ConnectionString???可選,字符串,包含連接信息。參閱ConnectionString?屬性可獲得有效設置的詳細信息。
UserID???可選,字符串,包含建立連接時所使用用戶名。
Password???可選,字符串,包含建立連接時所使用密碼。
Options???可選,ConnectOptionEnum?值。決定該方法是在連接建立之后(異步)還是連接建立之前(同步)返回。可以是如下某個常量:
?
常量 | 說明 |
adConnectUnspecified | (默認)同步打開連接。 |
adAsyncConnect | 異步打開連接。ConnectComplete?事件可以用于決定連接何時可用。 |
?
說明
使用?Connection?對象的?Open?方法可建立到數據源的物理連接。在該方法成功完成后連接是活躍的,可以對它發出命令并且處理結果。
使用可選的?ConnectionString?參數指定連接字符串,它包含由分號分隔的一系列?argument = value?語句。ConnectionString屬性自動繼承用于ConnectionString?參數的值,因此可在打開之前設置?Connection?對象的?ConnectionString?屬性,或在?Open?方法調用時使用?ConnectionString?參數設置或覆蓋當前連接參數。
如果在?ConnectionString?參數和可選的?UserID?及?Password?參數中傳送用戶和密碼信息,那么UserID?和Password?參數將覆蓋?ConnectionString?中指定的值。
在對打開的?Connection?的操作結束后,可使用?Close?方法釋放所有關聯的系統資源。關閉對象并非將它從內存中刪除;可以更改它的屬性設置并在以后再次使用?Open?方法打開它。要將對象完全從內存中刪除,可將對象變量設置為Nothing。
遠程數據服務用法????當在客戶端的?Connection?對象上使用?Open?方法時,在?Connection?對象上打開Recordset?之前?Open?方法其實并未建立到服務器的連接。
adModeUnknown 表示目前用ado連接數據庫的方式還不知道ad--ADO Mode-方式模式 Unknown-不知道,這種方式以后可以在程序中以表、視圖、查詢、SQL、過程等方式提取數據。
創建記錄集(在XXDlg中)
1 聲明變量 _RecordsetPtr m_pRecordset
2 添加記錄? (在OnInitDialog中)
Recordset.open
Recordset 對象的 Open 方法 允許用戶向數據庫發出請求,通過是運行一個 SQL
命令、啟動一個指定的數據表或調用一個指定的 Stored Procedure
格式:
Recordset.Open Source,ActiveConnection,CursorType,LockType,Options
1、Source 參數可以是一個 Command 名稱,一個 SQL 命令、一個指定的數據表
名稱或一個指定的 Stored Procedure。Recordset 對象可通過 Source 屬性連接
Command 對象。
2、ActiveConnection 參數可以是一個 Connction 對象名稱或是包含“數據庫連
接信息( ConnectionString )”的字符串信息。Recordset 對象可通過
ActiveConnection 屬性連接 Connection 對象。
3、CursorType 參數表示啟動數據的游標類型。
常數值說明:
AdOpenForwardOnly 0 啟動只能向前( Forward-only )的游標,缺省值
AdOpenKeyset 1 啟動 Keyset 類型的游標
AdOpenDynamic 2 啟動 Dynamic 類型的游標
AdOpenStatic 3 啟動 Static 類型的游標
4、LockType 參數表示采用的 Lock 類型。
常數值說明:
AdLockReadOnly 1 以只讀方式啟動,無法運行 AddNew、Update、Delete
等方法,缺省值
AdLockPessimistic 2 當數據正在更新時,系統會暫時鎖定其它用戶的動作
,以確保數據一致性
AdLockOptimistic 3 當數據正在更新時,系統不會暫時鎖定其它用戶的動
作
AdLockBatchOptimistic 4 當數據正在更新時,其它用戶必須將 CursorLocation
屬性設為 adUseBatch ,才能對數據庫操作
5、Options 參數表示對數據庫請求的類型。
常數值說明 :
AdCmdUnknown -1 所指定的 CommandText 參數類型無法確定,缺省值
AdCmdText 1 所指定的 CommandText 參數是一般的命令類型
AdCmdTable 2 所指定的 CommandText 參數是一個存在的表名稱
AdCmdStoredProc 3 所指定的 CommandText 參數是 Stored Procedure 表名稱
ADO Recordset
對象用于容納一個來自數據庫表的記錄集。一個 Recordset 對象由記錄和列(字段)組成。在 ADO 中,此對象是最重要且最常用于對數據庫的數據進行操作的對象。
ProgID
set objRecordset=Server.CreateObject("ADODB.recordset")
當您首次打開一個 Recordset 時,當前記錄指針將指向第一個記錄,同時 BOF 和 EOF 屬性為 False。如果沒有記錄,BOF 和 EOF 屬性為 True。
Recordset 對象能夠支持兩種更新類型:立即更新 - 一旦調用 Update 方法,所有更改被立即寫入數據庫。批更新 - provider 將緩存多個更改,然后使用 UpdateBatch 方法把這些更改傳送到數據庫。
在 ADO,定義了 4 中不同的游標(指針)類型
- 動態游標 - 允許您查看其他用戶所作的添加、更改和刪除
- 鍵集游標 - 類似動態游標,不同的是您無法查看有其他用戶所做的添加,并且它會防止您訪問其他用戶已刪除的記錄。其他用戶所做的數據更改仍然是可見的。
- 靜態游標 - 提供記錄集的靜態副本,可用來查找數據或生成報告。此外,由其他用戶所做的添加、更改和刪除將是不可見的。當您打開一個客戶端 Recordset 對象時,這是唯一被允許的游標類型。
- 僅向前游標 - 只允許在 Recordset 中向前滾動。此外,由其他用戶所做的添加、更改和刪除將是不可見的。
可通過 CursorType 屬性或 Open 方法中的 CursorType 參數來設置游標的類型。
注釋:并非所有的提供者(providers)支持 Recordset 對象的所有方法和屬性。
屬性
屬性描述AbsolutePage | 設置或返回一個可指定 Recordset 對象中頁碼的值。 |
AbsolutePosition | 設置或返回一個值,此值可指定 Recordset 對象中當前記錄的順序位置(序號位置)。 |
ActiveCommand | 返回與 Recordset 對象相關聯的 Command 對象。 |
ActiveConnection | 如果連接被關閉,設置或返回連接的定義,如果連接打開,設置或返回當前的 Connection 對象。 |
BOF | 如果當前的記錄位置在第一條記錄之前,則返回 true,否則返回 fasle。 |
Bookmark | 設置或返回一個書簽。此書簽保存當前記錄的位置。 |
CacheSize | 設置或返回能夠被緩存的記錄的數目。 |
CursorLocation | 設置或返回游標服務的位置。 |
CursorType | 設置或返回一個 Recordset 對象的游標類型。 |
DataMember | 設置或返回要從 DataSource 屬性所引用的對象中檢索的數據成員的名稱。 |
DataSource | 指定一個包含要被表示為 Recordset 對象的數據的對象。 |
EditMode | 返回當前記錄的編輯狀態。 |
EOF | 如果當前記錄的位置在最后的記錄之后,則返回 true,否則返回 fasle。 |
Filter | 返回一個針對 Recordset 對象中數據的過濾器。 |
Index | 設置或返回 Recordset 對象的當前索引的名稱。 |
LockType | 設置或返回當編輯 Recordset 中的一條記錄時,可指定鎖定類型的值。 |
MarshalOptions | 設置或返回一個值,此值指定哪些記錄被返回服務器。 |
MaxRecords | 設置或返回從一個查詢返回 Recordset 對象的的最大記錄數目。 |
PageCount | 返回一個 Recordset 對象中的數據頁數。 |
PageSize | 設置或返回 Recordset 對象的一個單一頁面上所允許的最大記錄數。 |
RecordCount | 返回一個 Recordset 對象中的記錄數目。 |
Sort | 設置或返回一個或多個作為 Recordset 排序基準的字段名。 |
Source | 設置一個字符串值,或一個 Command 對象引用,或返回一個字符串值,此值可指示 Recordset 對象的數據源。 |
State | 返回一個值,此值可描述是否 Recordset 對象是打開、關閉、正在連接、正在執行或正在取回數據。 |
Status | 返回有關批更新或其他大量操作的當前記錄的狀態。 |
StayInSync | 設置或返回當父記錄位置改變時對子記錄的引用是否改變。 |
方法
方法描述AddNew | 創建一條新記錄。 |
Cancel | 撤銷一次執行。 |
CancelBatch | 撤銷一次批更新。 |
CancelUpdate | 撤銷對 Recordset 對象的一條記錄所做的更改。 |
Clone | 創建一個已有 Recordset 的副本。 |
Close | 關閉一個 Recordset。 |
CompareBookmarks | 比較兩個書簽。 |
Delete | 刪除一條記錄或一組記錄。 |
Find | 搜索一個 Recordset 中滿足指定某個條件的一條記錄。 |
GetRows | 把多條記錄從一個 Recordset 對象中拷貝到一個二維數組中。 |
GetString | 將 Recordset 作為字符串返回。 |
Move | 在 Recordset 對象中移動記錄指針。 |
MoveFirst | 把記錄指針移動到第一條記錄。 |
MoveLast | 把記錄指針移動到最后一條記錄。 |
MoveNext | 把記錄指針移動到下一條記錄。 |
MovePrevious | 把記錄指針移動到上一條記錄。 |
NextRecordset | 通過執行一系列命令清除當前 Recordset 對象并返回下一個 Recordset。 |
Open | 打開一個數據庫元素,此元素可提供對表的記錄、查詢的結果或保存的 Recordset 的訪問。 |
Requery | 通過重新執行對象所基于的查詢來更新 Recordset 對象中的數據。 |
Resync | 從原始數據庫刷新當前 Recordset 中的數據。 |
Save | 把 Recordset 對象保存到 file 或 Stream 對象中。 |
Seek | 搜索 Recordset 的索引以快速定位與指定的值相匹配的行,并使其成為當前行。 |
Supports | 返回一個布爾值,此值可定義 Recordset 對象是否支持特定類型的功能。 |
Update | 保存所有對 Recordset 對象中的一條單一記錄所做的更改。 |
UpdateBatch | 把所有 Recordset 中的更改存入數據庫。請在批更新模式中使用。 |
事件
Note: You cannot handle events using VBScript or JScript (only Visual Basic, Visual C++, and Visual J++ languages can handle events).
事件描述EndOfRecordset | 當試圖移動到超過 Recordset 結尾的行時被觸發。 |
FetchComplete | 當異步操作中的所有記錄均被讀取后被觸發。 |
FetchProgress | 在異步操作期間被定期地觸發,報告已讀取多少記錄。 |
FieldChangeComplete | Field 對象的值更改被觸發。 |
MoveComplete | Recordset 中的當前位置更改后被觸發。 |
RecordChangeComplete | 一條記錄更改之后被觸發。 |
RecordsetChangeComplete | 在 Recordset 更改之后被觸發。 |
WillChangeField | 在 Field 對象的值更改之前被觸發 |
WillChangeRecord | 在一條記錄更改之前被觸發。 |
WillChangeRecordset | 在 Recordset 更改之前被觸發。 |
WillMove | 在 Recordset 中的當前位置更改之前被觸發。 |