MS SQL Server MFC DAO 類和 MFC ODBC 類:我使用哪個類集?
2024-08-31 00:48:10
供稿:網友
 
ms sql server mfc dao 類和 mfc odbc 類:我使用哪個類集?
來源:microsoft 比以往更靈活 mfc 數據庫策略 一系列選項 mfc 的 odbc 數據庫類 數據訪問對象 dao sdk 類 比較 mfc 數據庫類 優化您的 mfc 數據庫應用程序 結論 
jocelyn garner 
比以往更靈活 
自 mfc 數據訪問對象 (dao) 數據庫類在 1995 年 10 月發布以來,mfc 數據庫開發人員就已開始考慮該使用哪個類集。本白皮書并不力圖用常規術語回答此問題。相反,這里要強調的是對各種選擇進行檢查,以便您(即開發人員)可以確定每種情況最適合使用哪個 mfc 數據庫類集。 
大多數 mfc 開發人員都熟悉開放式數據庫連接 (odbc) 數據庫類 - 它們早在三年半以前就出現了。在 mfc 4.2 中,對這些類有一些重要的改進。 
身為 c++ 開發人員,您可能不熟悉 dao,因為到目前為止它還只可用于 microsoft access 和 visual basic® 程序設計系統。如果您熟悉 dao,就必須了解:dao 在 mfc 中的實現頗有不同,但包羅廣泛。 
了解 mfc odbc 類的開發人員必須知道:雖然 mfc dao 類比 odbc 類功能性更強,但 dao 類不能代替它們。 
mfc 數據庫策略 
對于那些不怎么熟悉 mfc 的人,我想提醒一句:mfc 有一個適用于各種數據庫類的設計原則。 
mfc 像一張薄薄的包裝紙那樣,封裝 windows® 操作系統 api,提供您想要的 c++ 性能,同時提供您需要的抽象概念。當基礎 api 具有實際意義時,向其添加值。可是多數時候 mfc 力圖保持不為人觸及。 
就如 mfc 封裝更復雜的 api 一樣,數據庫類也封裝更復雜的技術。因為 mfc 可以在 intel、unix 和 alpha 之間進行移值,所以數據庫應用程序解決方案也是可移值的。 
我們與 microsoft access、visual basic 使用相同的記錄集模型,因此,已經使用那些產品的開發人員不必學習新的范例。另外,兩個類集的體系結構基本相同,使用其中一個類集的開發人員可以輕松地切換到另一個類集并使用它。 
mfc 數據庫類 
自從 1.5 版之后,mfc 中就已經包含 odbc 數據庫類。visual c++ 2.0 版提供了含有相同類的 32 位版本。這些類基于一個工業認可標準,并已得到廣泛應用,且因其 odbc 具有可移植性而受到其它數據庫開發選擇方案的青睞。這種可移植性是指能夠將許多 odbc 數據源與用這些類創建的應用程序一起使用。近來的性能改進使得 odbc 數據庫類成為一個吸引人的選擇方案。 
在多數情況下,mfc 4.0 中的 dao 數據庫類允許您直接訪問桌面數據源而無須使用 odbc。dao 數據庫類所具有的同時打開多個數據庫類型的能力、使用多數據源的能力以及數據定義語言能力,使其成為重要的開發選擇方案。 
現在,您已經準備好提出這個問題,自己應使用哪個數據庫類集合。如果您所提供的有關自己項目的信息不多,就很難確定這個問題的答案。但是,第一件要考慮的事情是您使用什么數據源。如果您通常使用桌面數據,我們鼓勵您考慮 mfc dao 數據庫類,因為您將會發現它們極為有效且功能強大。如果您主要使用 odbc(基于服務器)的數據,則使用基于 odbc 的類會使您項目的進展更富成效。 
其它考慮事項包括網絡種類、可伸縮性要求,以及速度是否是最重要的因素。最好是用您認為工作得最好的數據庫類集讓應用程序保持原型。可以進行一些基準測試,以確定您的最佳性能選擇。 
真正的決定權在您。 
一系列選項 
您可用來創建數據庫應用程序的選項集合很大。它實際是完整的一系列選項,一端是桌面數據庫應用程序,另一端是嚴格的客戶/服務器數據庫應用程序。僅有的兩種看似明顯的選擇可能是:在 microsoft access 97 mdb 數據中使用 mfc dao 數據庫類,而在 microsoft sql server ™ 6.5 中使用 mfc odbc 數據庫類。這兩種組合主要是互相配合使用的,均非常有效。但您可能已對這些選擇有所了解,其它情況又該如何呢? 
簡要地說,以下是您賴以決策的過程: 
確定數據源需求 
您需要的數據庫有多大? 一次會有多人需要訪問數據嗎? 有時,其余的大多數步驟均取決于您選擇的數據源。 
確定接口需求 
如果您需要的接口有大量的用戶輸入(如用戶可以設計自己的查詢),那么在調整和分發數據庫(一個或多個)時就必須要慎重。例如,如果需要用變化不大的數據填充列表框,并且已選擇基于服務器的數據源,則將通常不變化的數據存儲在本地而非服務器上,是一種有意義的做法。 
確定連接性需求 
目前使用的網絡協議有很多種,每種協議都對通過網絡傳送的數據各有不同影響。關于網絡的討論不是本白皮書份內之事,但您需要了解如何優化自己的數據庫應用程序,以避免遇到網絡的數據陷阱。 
選擇適當的工具(一個或多個) 
microsoft 為數據庫開發人員提供了多種可選擇的工具(microsoft access、visual basic、visual basic enterprise、visual c++/mfc 以及 sql server),在某些情況下它們的功能略有重疊。本白皮書旨在討論 visual c++/mfc 選項。但如果您還未考慮其它選項,應該也對它們稍加了解。 
在實施前保持原型 
在本白皮書中您將數次看到此陳述,因為它很重要。您可能已做了很好的選擇,但除非您的解決方案真的起了作用,否則工作就不算完成! 
此外,關于本白皮書,我們假設您想了解的是 mfc 的數據庫類。我們不妨盡可能多地檢查一些選擇方案,以便您認可您想為自己的第一個原型采用的指導。 
mfc odbc 數據庫類使用 microsoft access 和 visual basic 中的記錄集模型。您可以用內置于類中的成員函數對記錄進行篩選、分類、滾動以及其它處理。基礎 odbc 驅動程序會影響特殊應用程序的功能。因此,若要使可移植性更強,您的應用程序就必須更具有通用性,或者必須依賴于更低級別的 odbc 功能。如有必要,可以直接調用 odbc,以完成特殊任務。現在,讓我們檢查該集合中的單個類。 
mfc 的 odbc 數據庫類 
就象使用 mfc 那樣,必要時可以調用基礎 api(在此情況下為 odbc)。 
一個 cdatabase 對象代表一個到數據源的連接,通過此連接您可以在數據源上進行操作。數據源是指以某些數據庫管理系統 (dbms) 作為宿主的指定數據實例。具體示例包括 microsoft sql server、microsoft access、borland dbase 和 xbase。您可以在自己的應用程序中同時讓一個或多個 cdatabase 對象處于活動狀態,并且可以保持到一個數據庫對象的多個連接。 
一個 crecordset 對象代表從數據源中選擇的一個記錄集合。稱為“記錄集”的 crecordset 對象有三種可用的形式:動態集、快照、動態記錄集。動態集是與其他用戶的更新保持同步的記錄集。快照是靜態記錄集,它反映的是抓拍快照時數據庫的狀態。動態記錄集類似于動態集,但通常只用于 microsoft sql server。每種形式都代表在打開記錄集時確定的記錄集合,但當您在動態集內或動態記錄集內滾動到一條記錄時,它反映后來由其他用戶或您應用程序中的其它記錄集對記錄所做的更改。 
mfc 4.2 以書簽的形式向 crecordset 類中添加新的導航功能,并添加標識及導航到記錄的 absoluteposition 的能力。書簽是唯一的標識符,通過調用該標識符可返回指定的記錄。 
類 crecordview 是一種 mfc 構造 - 一種顯示數據的形式。因為 crecordview 是基于 cformview 的,所以它具有該基礎類的所有遺傳功能。從本質上說,窗體視圖在窗口的客戶端區域伸展對話框模板。這使得添加控件與顯示字段數據極為容易。 
當使用 appwizard 和 classwizard 創建基于 odbc 的數據庫應用程序時,記錄集的列會自動綁定到(靜態地)成員變量,這些變量可以隨后添加到對話框模板中。 
一個 cdbexception 對象代表一種由數據庫類引起的異常錯誤條件。該類中含有兩個公共數據成員,可使用這兩個成員確定導致異常錯誤的原因,或顯示對異常錯誤進行說明的文本消息。cdbexception 對象由數據庫類的成員函數構造與拋出。 
cfieldexchange 類支持由數據庫類使用的記錄字段交換 (rfx) 例程。如果您正在編寫自定義數據類型的數據交換例程,則使用該類;否則,您不會直接使用該類。rfx 在您記錄集對象的字段數據成員和數據源上當前記錄的相應字段之間交換數據。rfx 管理兩個方向中的交換,即來自數據源的交換與到數據源的交換。 
數據訪問對象 
在 dao 的本機格式中,包含 21 個對象和 20 個集合。而且,dao 不僅提供單個的對象,如表和字段,還提供對象所屬的集合。對象的這種清晰的層次結構使得能夠輕松地將面向對象的原理應用于數據庫開發。 
dao 的存在已有一段時間。dao 1.0 版出現在 microsoft access 1.0 版中,它僅提供到表與查詢結構的接口,以及代表具有數量有限的屬性的表、動態集、快照的對象。visual basic 3.0 版中的 data access objects 1.0 添加了 tabledef、querydef 和 field 對象,以提供可編程的結構。 
microsoft access 2.0 版中的 dao 2.0 版有 ole 自動化的雛形,以及對幾乎所有 microsoft jet 功能的全部編程訪問權限。它擁有具有可靠的對象與屬性集合的全部對象模型。 
dao 2.5 版中含有 odbc 桌面數據庫驅動程序 (odbc desktop database driver),這些驅動程序是為 16 位平臺能與 odbc desktop database drivers 2.0 版一起使用而創建的。該 16 位版本是為用于 visual basic 4.0 版的 16 位版本而安裝的。 
dao 3.0 版隨帶在 microsoft access for windows 95、visual basic 4.0 版(32 位)、microsoft excel 7.0 版 和 visual c ++ 4.0 版中。dao 得到了增強,以支持任何兼容主機的單機接口。 
dao 3.5 版隨帶在 microsoft access for windows 97 中,并且含有新的 odbcdirect com 對象。mfc dao 數據庫類不包括這些對象的類。 
最為重要的是,dao 接口是基于 ole com 的,它很好地安置 dao 以適應不斷發展的技術和操作系統。 
 
此處是 dao 層次結構圖表。在頂端,將看到 dbengine 對象,該對象中含有所有其它對象。這是唯一沒有集合的對象,因為您只能有一個引擎。但可以有多個工作區 (workspace)、數據庫 (database) 等等,這正是余下的對象都有自己所屬集合的原因。 
在工作區中,可以有多個數據庫,一個基本表 (.mdb) 或一個附加/鏈接的表。在每個數據庫中將有一個或多個表、查詢、記錄集,而其中的每個表、查詢、記錄集不僅包含字段和(或)索引,還有其它類型的對象。 
另外,與工作區連接的是用戶對象和組對象,它們形成了 dao 的安全模型。 
獨立但與引擎對象連接的是 errors 對象。 
errors 集合中對象的附加方式不同于其它 dao 集合。最詳細的錯誤放在集合的末尾,最常規的錯誤放在開頭。 
mfc 和 dao 
現在要談的是 mfc 如何實現 dao。因為我們不是分別包裝每個 dao 對象,所以實際上 mfc 會平展 dao 的層次結構。我們為您提供 8 個對象而不是 21 個對象。 
我們封裝所有的 dao 功能,除 security 對象外 - users 對象、groups 對象以及新的 odbcdirect 對象。這是我們有意而為。例如,我們覺得在查看安全性對象時,圍繞它們創建類將不會給 dao 的使用添加任何值,因此還是讓您直接調用 dao,來處理那些對象。這也是與 mfc 原則一致的:應該在對添加值的立場而言有意義的地方創建類。但我們仍會在 mfc technical note 54 中提供關于如何實現安全性模型的指導。 
另外,我們還管理 dao 要將對象追加到集合的要求。在 dao 中,您創建對象,然后將它追加到集合中。除一種例外情況外,這種添加是自動完成的。對于這種例外情況,可作為一個單獨的步驟來設置開發人員能否追加對象,這是很用的。 
雖然可能用 odbc 數據庫類進行動態綁定,但實現這一目的的功能并非 mfc 類的內置功能。它被置入 dao 數據庫類,您可以相當輕松地進行動態綁定。現在我們的第二個演示將更多地談及這一點。 
dao 提供來自 sql 的數據定義語言 (ddl),以便您創建數據庫、表、記錄集等。在 odbc 中沒有 ddl。 
最后,當您需要時,總是可以對基礎 dao ole 對象進行直接調用。 
mfc dao 數據庫類的層次結構 
 
五個由 cobject 派生的 mfc dao 類(cdaoworkspace、cdaodatabase、cdaotabledef、cdaoquerydef 和 cdaorecordset)具有該基礎類的所有功能。 
cdaoexception 由 cexception 派生得到,具備該類的優點,包括顯示來自基礎 dao errors 對象的錯誤消息的能力。 
如前面提到的那樣,cdaorecordview 由 cformview 派生得到,而 cformview 又由 cscrollview 派生得到,依次類推。可以看到 cdaorecordview 類在快速而輕松地實現基于窗體的數據顯示方面所具有的全部優點。此外,還有對于 cdaorecordview 的向導支持。該類中的功能實質上是與 crecordview 類一樣的。 
cdaofieldexchange 類支持由 dao 數據庫類使用的 dao 記錄字段交換 (dfx) 例程。如果要創建自定義的 dfx 例程,只要直接調用該對象即可。 
mfc dao 數據庫類 
cdaoworkspace 封裝 dbengine 對象和 workspace 對象。mfc dao 類提供工作區的事實非常重要。odbc 數據庫類不同時支持多個數據庫連接。 
事務處理是在 dao 數據庫類中的 workspace(工作區)級別完成的,而不是在 odbc 類中的 recordse(記錄集)級別完成的。一個事務可能會影響所有打開的數據庫和記錄集,或者您可以隔離事務,使其只會影響指定的數據庫,等等。 
多數時候,您不必擔心工作區對象的創建。如果您未創建,mfc 就將為您打開一個工作區對象。如果您需要的話,dao 數據庫類可支持多個工作區。 
最后,您不必擔心工作區對象超出范圍或是在數據庫會話完成前關閉。可以使用工作區指針訪問工作區集合,訪問數據庫集合,以及訪問數據庫引擎的屬性等。 
cdaodatabase 
cdaodatabase 在體系結構上類似于基于 odbc 的 cdatabase 類。cdaodatabase 也封裝數據庫連接。因為您不必總是使用 odbc,所以對于大多數桌面數據源,數據源的位置就表達為路徑。cdaodatabase 可以存儲 tabledef 和 querydef 對象,為您的開發提供了極大方便。cdaodatabase 可使用本地及遠程數據源。在本白皮書的稍后部分,有一個可供您使用的數據源的列表。 
該數據庫對象在會話期間也一直繼續存在。必要時可以明確地關閉數據庫連接。僅就比較而言,cdatabase 類有 21 個成員函數,而 cdaodatabase 有 26 個成員函數。這些成員函數中彼此相應的都非常相似,在 cdaodatabase 中還有幾個沒有對應成員函數。 
在 odbc 數據庫類中沒有與 cdaotabledef 相應的類。tabledef 對象讓您檢查數據庫的架構(結構),不論表是本機 microsoft access 表(基本表)還是鏈接的表。如果用 dao 直接打開外部數據源,就可向其中添加字段和索引。如果您鏈接了表,就可以檢查結構,但不能更改它。可以將表作為記錄集的基礎。這樣做會使您獲得幾個好處,包括使用名為 seek 的快速搜索成員函數。 
使用 cdaotabledef 可以確定是否可通過調用 cdaotabledef::canupdate 編輯表中的數據。mfc 負責為您管理 dao field 和 index 集合。使用 cdaotabledef 時,您可以選擇是否向 tabledefs 集合中追加表;而使用所有其它對象時,會自動進行追加。 
您用來檢索記錄的 sql 存儲在 cdaoquerydef 對象中。您可用該對象存儲您提出的有關數據的“問題”,如“how many customers did x dollars of business last month?”。可以檢索或重新使用存儲的查詢,可按下列三種方法之一使用它們: 通過將指針傳遞到 cdaoquerydef 對象而創建記錄集。 直接執行操作查詢,即移動或更改數據的查詢。操作查詢包括追加、刪除、生成表以及更新查詢。刪除查詢和更新查詢會更改現有數據;附加查詢和生成表查詢會移動現有數據。 執行 sqlpassthrough 查詢:sql 直接傳遞查詢是直接發送到數據庫服務器而不會被 microsoft jet 數據庫引擎中斷的 sql 語句。sql 直接傳遞查詢為您的應用程序提供直接使用數據庫服務器的功能的能力。 
另外,cdaorecordset 還很類似于基于 odbc 的 crecordset 類。記錄集不僅可以基于表,也可以基于動態集和快照。請記住,記錄集代表您已檢索到的記錄和穿過數據的方法。移動并滾動數據的方法包括 seek(只用于表類型的記錄集)、find 和 move 操作,以及 absoluteposition 和(如果您的數據源支持的話)書簽。書簽是唯一的標識符,可通過調用該標識符來返回指定的記錄。 
mfc dao 數據庫類中的大部分功能是存在于 cdaorecordset 中的。crecordset 只有 44 個成員函數,與之相比 cdaorecordset 有 91 個成員函數。這種額外的功能表現為字段值的導航、高速緩存、設置和檢索中,以及記錄集屬性的設置和檢索。 
cdaorecordview 和 crecordview 類有幾乎相同的功能。另外,它們都還具有因基于 cformview 而獲得的優點。請記住,窗體視圖就好象在窗口的客戶端區域伸展的對話框模板一樣,有了它,添加控件與顯示字段數據就很容易。appwizard 和 classwizard 支持基于窗體的數據顯示。如果使用 appwizard 創建初始應用程序,您數據庫中的列就會自動綁定到成員變量。 
對于 dao 數據庫類,異常錯誤處理略有不同。類 cdaoexception 將返回基礎 dao ole 對象的錯誤消息。多數時候,您可以檢索的錯誤信息要比通常采用基于 odbc 的類所獲得的錯誤信息多。在 mfc 中,所有 dao 錯誤都表達為 cdaoexception 類型的異常錯誤。 
當捕獲到這種類型的異常錯誤時,可以使用 cdaoexception 成員函數從任何存儲在數據庫引擎 errors 集合中的 dao 錯誤對象中檢索信息。每個錯誤發生時,都會有一個或多個錯誤對象放入 errors 集合中。當另一個 dao 操作生成錯誤時,errors 集合被清除,新的錯誤對象被放入 errors 集合。 
cdaofieldexchange 類支持由 dao 數據庫類使用的 dao 記錄字段交換 (dfx) 例程。如果您正在編寫自定義數據類型的數據交換例程,則使用該類;否則,您不會直接使用該類。dfx 在您 cdaorecordset 對象的字段數據成員和數據源上當前記錄的相應字段之間交換數據。dfx 管理兩個方向中的交換,即來自數據源的交換與到數據源的交換。若需關于編寫自定義 dfx 例程的信息,請參見 technical note 53(可在 books online 中的 mfc 下找到)。 
cdaofieldexchange 對象提供發生 dao 記錄字段交換所需要的上下文信息。cdaofieldexchange 對象支持許多操作,包括綁定參數和字段數據成員,以及在當前記錄的字段上設置各種標志。dfx 操作是在類型的記錄集類數據成員上執行的,這些類型由 cdaofieldexchange 中的 enum fieldtype 定義。可能的 fieldtype 值有: 用于字段數據成員的 cdaofieldexchange::outputcolumn。 用于參數數據成員的cdaofieldexchange::param。 
 
圖 1 mfc 的 odbc 數據庫類 
這里是基于 odbc 的數據庫類的圖片,與您所了解的相同。頂端的欄代表基于 odbc、與 odbc 交談的 mfc 類。每個數據庫的 odbc 驅動程序都解釋 sql 調用,并針對每個數據源對其進行轉換。許多數據源都與相應的驅動程序一起顯示在關系圖的底部,以提醒您 odbc 的靈活性。 
圖 2 是 dao 數據庫類的圖片。它們通過含有 dao 的 ole 進行通信,dao 與 jet 數據庫引擎交談。jet 數據庫引擎有一些獨立的 dll,用于與各種桌面數據源進行通信。 
 
圖 2 mfc dao 數據庫類 - 桌面數據源 
microsoft jet 數據庫引擎可以直接打開諸如 foxpro® 數據庫和 paradox 等的數據源。但只要您不需要更改這些數據源的架構,就可以將這些表鏈接到 microsoft access 數據庫中,實際上這會更有效。這就是 foxpro 和 paradox 表(它們僅是示例)顯示在兩個位置的原因。虛線用以暗示當可能直接打開數據源時,它的效率會更低。 
被鏈接表的外觀及工作方式與 microsoft jet 數據庫中的任何其它表一樣(雖然在連接到遠程數據和檢索遠程數據方面略微有些性能差異)。建立和維護與遠程數據源連接所需要的信息存儲在表定義中。 
相反,當您直接打開表時,必須在每個會話開始時提供連接信息,以便建立與數據源的連接。建立與遠程數據源的連接所需要的信息都不存儲在 microsoft jet 數據庫中。若要直接打開表,就必須使用 cdaotabledef::create,并且必須提供連接信息(如數據源、用戶名、密碼和數據庫名稱)。 
 
圖 3 mfc dao 數據庫類,包括 sql 數據庫 
如果使用 dao 數據庫類,就可以經由 odbc 訪問服務器類型的數據庫(如 microsoft sql server 和 oracle)。圖 3 不是完整的圖片,因為它并沒有包括對所有類型數據源的訪問。 
最后,圖 4 是關于 mfc 數據庫類的完整圖片。請注意,mfc 欄和 odbc 欄上的垂直線表示指派兩個數據庫類集用作“非此即彼”決策。您可以選擇訪問所有類型的數據源,但不能混合兩個集合中的 mfc 數據庫類。 
 
圖 4 mfc 數據庫類 
odbc 數據庫類的數據源選擇 
當您用 mfc odbc 類編寫應用程序時,可以連接到任何數據源(只要您有它的 odbc 驅動程序)。odbc 驅動程序管理器和 odbc 驅動程序的操作在您用這些類編寫的應用程序中是透明的,但個別驅動程序性能會影響應用程序的功能。 
通常,mfc 動態集(但并非只向前滾動的記錄集)要求 odbc 驅動程序具有 2 級 api 一致性。如果數據源的驅動程序符合 1 級 api 設置,您就仍可以使用可更新且只讀的快照與只向前滾動的記錄集,但不能使用動態集。然而,如果 1 級驅動程序支持擴展的提取和鍵集驅動游標,它就可以支持動態集。 
odbc desktop driver pack 3.0 版支持 2 級 odbc api 調用 sqlextendedfetch。 
appwizard 和 classwizard 會自動將數據源的列靜態地綁定到您應用程序的成員變量中。這是在您應用程序與數據源之間建立連接的最簡單的方法,但不是最靈活的方法。可以用類 cfieldexchange 將自定義的記錄字段交換 (rfx) 調用添加到您的應用程序中。請參見“technical note 43:rfx routines”,以獲取更多信息。 
另外,還可以考慮動態地綁定數據庫的列。在最普通的級別中可執行下列步驟: 構造您的主要記錄集對象。然后,可以將指針傳遞給一個打開的 cdatabase 對象,或者也可以用其它方法向列記錄集提供連接信息。 執行一些步驟,動態地添加列。 打開您的主要記錄集。 
記錄集會選擇記錄,并使用記錄字段交換 (rfx) 綁定“靜態”列(映射到記錄集字段數據成員的列)和動態列(映射到您分配的額外存儲的列)。 
dao 數據庫類的數據源選項 
現在我們要談的是您可以用 dao 數據庫類連接的數據源、列的靜態綁定、列的動態綁定,以及記錄的雙緩沖。 
既然 microsoft access 數據庫是 jet 的本機數據庫,您自然就可以以最快速度訪問它們。microsoft access 97 具有的數據庫格式是 dao 3.5 版的本機數據庫格式。如果使用 microsoft access 97 數據庫,將獲得最為快速的性能。 
jet 使用單獨的 dll 提供對 microsoft jet 1.x 和 2.0 版數據庫的訪問權限。存儲引擎和格式完全是用 microsoft jet 3.0 版修訂的。假如更改之處很多,microsoft jet 3.0 版就會將 2.0 版數據庫視為外部 isam,這會影響性能。因此,這也是促使您應該考慮將 microsoft access 數據庫升級的合理原因。 
另外,您還可以訪問可安裝的 isam 數據庫和 odbc 數據源。isam(基于索引的連續訪問方法)數據庫,如 foxpro 和 dbase,可以直接打開,也可以鏈接到 access 數據庫以實現最佳性能。下面是 dao 可以訪問的數據源的列表: microsoft foxpro 的 2.0、2.5 和 2.6 版。在 3.0 版中可以導入與導出數據,但不能創建對象。 dbase iii、dbase iv 和 dbase 5.0 paradox 的 3.x、4.x 和 5.x 版 btrieve 的 5.1x 和 6.0 版 microsoft excel 的 3.0、4.0、5.0、7.0 和 8.0 版工作表 lotus wks、wk1、wk3、wk4 電子表格 文本文件 
請記住,microsoft access 的 1.x、2.0 和 7.0 版數據庫都屬于此類別。 
可以通過 odbc 訪問 odbc 數據源,如 sql server 和 oracle,因此您可以選擇針對這些數據源使用 dao。一個 odbc 數據源可以來自任何 dbms,只要您擁有該 dbms 的適當的 odbc 驅動程序。對于 visual c++ 2.0 版或更高版本,您需要 32 位的 odbc 驅動程序(但 win32 除外,在 win32 中需要 16 位的 odbc 驅動程序)。下面是此版本 visual c++ 所包含的 odbc 驅動程序列表。 sql server microsoft access microsoft foxpro microsoft excel dbase paradox 文本文件 
microsoft desktop database drivers 3.0 版(它包含列表中的最后六項)為這些數據源提供最佳性能。這些只限 32 位驅動程序。 
將外部數據源(如 sql server)鏈接到 microsoft access 表是最有效的處理數據訪問的方法。在將應用程序連接到遠程數據源以前,必須先確保應用程序的用戶可以訪問遠程數據,并且確保正確地設計您的應用程序,以解決遠程數據源安全性難題。另外,您還必須確保應用程序能夠正確地與區分大小寫的數據源進行交流,并且確保正確地初始化可安裝的 isam,以用于您想訪問的數據源。最后,您必須檢查您的代碼,以確保在訪問非 jet 數據源時,代碼沒有使用 microsoft jet 數據源專用的對象或調用。 
設置鏈接最簡捷的方法是:進入 microsoft access。如果用的是 microsoft access 2.0 版,則使用“文件”/“附加表”命令;如果用的是 microsoft access 95 和 microsoft access 97,則使用“文件”/“獲取外部數據”/“鏈接表”命令。 
連接信息存儲在您所使用的基本表 (.mdb) 中。如果移動了外部數據的位置,就必須在 microsoft access 中或從代碼中調用 cdaotabledef::refreshlink,重新建立鏈接。 
dao 記錄字段交換機制與在基于 odbc 的數據庫類中的 rfx 有著相同的工作方式。記錄集對象的字段數據成員如果聯系在一起,就形成一個“編輯緩沖區”,以保存一個記錄的選定列。當記錄集第一次打開并要讀取第一條記錄時,dfx 就會將每個選定列與適當字段數據成員的地址綁定(關聯)在一起。當記錄集更新一條記錄時,dfx 調用 dao 以向數據庫引擎發送適當的命令。dfx 利用它對字段數據成員所了解的內容,指定要寫入的數據源中的列(字段)。 
向導支持列的靜態綁定。您可以添加自己的 dfx 調用,就象使用基于 odbc 的類時那樣。首先,對于每個綁定字段和參數,都必須將成員添加到 cdaorecordset 派生的類中。接下來,cdaorecordset::dofieldexchange 應被替代。請注意,成員的數據類型很重要。它應與來自數據庫字段中的數據匹配,或者至少可轉換成那種類型。mfc technical #53 更詳細地講述了此過程。 
cdaofieldexchange 類支持由 dao 數據庫類使用的 dao 記錄字段交換 (dfx) 例程。如果您正在編寫自定義數據類型的數據交換例程,則使用該類。cdaofieldexchange 對象提供發生 dao 記錄字段交換所需要的上下文信息。cdaofieldexchange 對象支持許多操作,包括綁定參數和字段數據成員,以及在當前記錄的字段上設置各種標志。 
dao 數據庫類中的動態綁定 
如果可以用基于 odbc 的類動態綁定列,對這種行為的支持就不會內置于 mfc 類中。動態綁定會內置在 dao 數據庫類中,而且執行起來相當容易。 
還可以做一些其它的事情以優化性能,如檢索記錄的一部分而不是整個記錄。在本陳述的稍后部分中,我們將提供一些可以優化應用程序的方法。 
dfx 和動態綁定不是互相排斥的選擇方案。通過 dao 數據庫類,可以將靜態和動態綁定調用混合,以實現最大效率。 
dao 數據庫類中的雙緩沖 
在 mfc 的 cdaorecordset 類中,雙緩沖是一種當記錄集內的當前記錄發生更改時簡化檢測的機制。當添加新記錄和編輯現有記錄時,對您的 dao 記錄集使用雙緩沖會減少必需的工作量。默認情況下,您的 mfc dao 記錄集保留編輯緩沖區的第二份副本(記錄集類的字段數據成員,全體復制;dao“幫助”中稱相應的緩沖區為“復制緩沖區”)。當您對數據成員進行更改時,mfc 會拿它們與副本(“雙緩沖區”)進行比較以檢測更改。 
雙緩沖的代用方法 - 不保留數據的副本 - 當編輯當前記錄的字段時,要求您進行其它函數調用。 
雙緩沖一直是基于 odbc 的數據庫類的一部分。對于 dao 數據庫類,如果需要,您可以停用該機制以提高效率。 
該機制的主開關名為 m_bcheckcachefordirtyfields,dirty 意思是“已更改”。如果將此開關置于 on(開),就可以對全部或部分字段啟用雙緩沖。如果該主開關是 off(關),就會禁用整個雙緩沖機制。 
您最想關閉其雙緩沖的字段包括備注字段、圖片字段,以及其它 blob(大型二進制對象)。 
dao sdk 類 
dao sdk 中含有一些 c++ 數據庫類,這些類彼此獨立,而且不同于 mfc dao 數據庫類。這些 c++ 類將單個對象封裝到 dao 層次結構中。雖然您可以將 dao sdk c++ 類與 mfc dao 數據庫類混合,但 dao sdk c++ 類不遵循操作符超載的 mfc 準則,并且在混合使用這些類時您必須當心。有關的詳細信息,請參閱 microsoft systems journal(1999 年 6 月)中的文章“the dao of databases:using data access objects and the jet engine in c++”。 
下表比較了 dao sdk 類的功能與 mfc dao 數據庫類的功能。 dao sdk 數據庫類
mfc dao 數據庫類
從 visual basic 進行簡單的遷移
從 mfc odbc 數據庫類進行簡單的遷移
直接映射到 dao 的 ole 自動化對象
符合 mfc 標準兩相結構
更多的 jet/dao 功能
支持 appwizard 和 classwizard
不符合 mfc 標準兩相結構
隱藏更困難的 dao 功能
對那些用慣了 visual basic 的人而言,使用 dao sdk 類是更容易實現的轉換,但它不符合 mfc。那些已經使用 mfc odbc 數據庫類的開發人員則會發現,mfc dao 類的體系結構和用法對他們來說很熟悉。 
比較 mfc 數據庫類 
我們不妨首先重點討論兩個類集內共同的數據庫功能。 
二者都支持對記錄集進行滾動 odbc 類依賴于基礎驅動程序。 dao 類能更好地支持 mdb,對可安裝的 isam 有益;并且對基于服務器的數據,dao 類與 odbc 數據庫類的支持程度相同。 
二者都支持事務 在 database(數據庫)級別的 odbc 類。 在 workspace(工作區)級別的 dao 類。 記錄集更新功能幾乎相同。 二者都支持在更新期間鎖定記錄。 兩個類集都支持字段數據更改的檢測。 二者都有 move 操作。 cdatabase 和 cdaodatabase 都可檢測數據源是否接受事務。自從 mfc 4.2 開始,odbc 數據庫類中的事務要求就相當寬松了。 兩種數據庫對象都允許您設置預定義的查詢超時時期。 二者都可以執行直接的 sql 語句。 
odbc 數據庫類的其它功能 自從 mfc 4.2 開始,odbc 數據庫類就是多線程的。若要利用此性能,就必須使用多線程的 odbc 驅動程序。dao 正開發成單元線程,但尚未確定何時能投入使用。 在 mfc 4.2 中,大量行提取功能是新功能,另外還添加了特殊的導航能力。 
在針對許多問題的解答中,我們已經對控制臺數據庫應用程序給予了更好的支持。cdatabase::openex 中的新選項有: cdatabase::noodbcdialog 無論提供的連接信息是否足夠,都不顯示 odbc 連接對話框。 cdatabase::forceodbcdialog 總是顯示 odbc 連接對話框。 
dao 數據庫類的其它功能 workspace、tabledef 和 querydef 對象均是 dao 數據庫類所獨有的。在 odbc 數據庫類中沒有這些對象的直接等價對象。 cdaotabledef 和 cdaoquerydef 功能通常可以通過直接的 odbc 調用而重復使用(如 catalog2 示例中所示的調用)。 cdaodatabase 支持 tabledef、querydef 和 relation 的創建。 
cdaorecordset 具有更強的導航功能 find 操作 百分比位置 seek 大量記錄提取功能和相關的高速緩沖都是內置的 在運行時用 cdaotabledef 對象創建字段和索引的能力是極佳優勢,這可用于對支持它的數據源進行確認。 cdaoquerydefs 可以通過使用字段和索引而創建,并可存儲起來以備重復使用。 cdaoquerydefs 還可以控制 odbc 超時。 
優化您的 mfc 數據庫應用程序 
有一些明顯但常被忽略的方法可以改進應用程序的性能。例如,查明您的網絡怎樣才能增強或妨礙數據檢索(如異步查詢)。 
您所擁有的 odbc 驅動程序的類型可能也會影響網絡的性能。 單級驅動程序用于那些不基于 sql 的數據庫。其數據庫文件直接由該驅動程序處理。該驅動程序處理 sql 語句并從數據庫中檢索信息。sql 語句一經分析與轉換后,就作為基本文件操作傳給數據庫。處理 xbase 文件的驅動程序是執行單級驅動程序的一個示例。 單級驅動程序可能會限制可提交的 sql 語句集合。單級驅動程序必須支持的最小 sql 語句集合是在附錄 c“sql 語法”中的 odbc sdk《程序員指南》中定義的。 單級驅動程序通常要比使用本機 dbms 工具(如 microsoft foxpro)慢一些,因為它們要分析 sql 語句分析并將其轉換成基本文件操作。它們慢到什么程度取決于該進程的優化程度。兩個不同單級驅動程序之間的速度差異通常要歸因于優化的方法。 在多級配置中,驅動程序將請求發送到處理這些請求的服務器。請求采用的格式可能是 sql 或 dbms 專用的格式。雖然整個安裝可以在一個系統上完成,但更常見的則是分布到各個平臺中。通常,應用程序、驅動程序和驅動程序管理器均駐留在一個系統上,稱為客戶端。而數據庫和控制對數據庫訪問的軟件則駐留在另一個系統上,稱為服務器。有兩種類型的多級驅動程序:兩級和三級(或網關)。有關的詳細信息,請參見 colleen lambert 的文章“odbc:architecture,performance,and tuning”(位于 microsoft developer network 光盤)。 
優化 odbc 數據庫和記錄集對象 
當您打開 cdatabase 對象時,就可以提供數據源名稱或 null 以向用戶顯示選擇對話框。mfc odbc 數據庫類不支持對數據庫的排它性訪問,因此連接總是共享的。但是,您可以以只讀方式打開數據庫。請記住,如果這樣做,則所有從該 cdatabase 對象派生的記錄集將也是只讀的。下面的選項可使得控制臺應用程序的編寫更為容易。這些新選項是用戶最常請求的。 cdatabase::noodbcdialog 無論提供的連接信息是否足夠,都不顯示 odbc 連接對話框。 cdatabase::forceodbcdialog 總是顯示 odbc 連接對話框。 
您可以選擇將 odbc 游標庫與您的應用程序裝載到一起。根據基礎驅動程序的性能,您也可能不需要它。游標庫可掩藏基礎 odbc 驅動程序的某些功能,從而有效地防止使用動態集(如果驅動程序支持它們)。如果裝載了游標庫,將只支持靜態快照和“forwardonly”游標。 
所打開的 crecordset 對象的類型將對應用程序性能有很大影響。如果您想讓動態記錄集實現雙向滾動,請選擇 crecordset::dynaset 類型。若想讓靜態記錄集實現雙向滾動,請選擇 crecordset::snapshot 類型。如果不需要對數據進行來回滾動,請選擇 crecordset::forwardonly 類型,這樣會創建一個只能向前滾動的只讀記錄集。新的 crecordset::dynamic 類型記錄集是一個可雙向滾動的記錄集。在進行提取操作后,其他用戶對成員身份、排序以及數據值所做的更改都是可見的。但是請注意,許多 odbc 驅動程序不支持這種類型的記錄集。 
crecordset 的其它選項有: crecordset::none 未設置任何選項。默認情況下,可以用 edit 或 delete 對記錄集進行更新,而且允許用 addnew 追加新記錄。可更新性不僅取決于數據源,也取決于您指定的選項。 crecordset::appendonly 不允許在記錄集上進行 edit 或 delete 操作。只允許使用 addnew。 crecordset::readonly 以只讀方式打開記錄集。 crecordset::optimizebulkadd 使用已準備好的 sql 語句,一次優化添加多個記錄的操作。該選項與 crecordset::usemultirowfetch 是互斥的。 crecordset::usemultirowfetch 執行大量行提取,以允許在一個提取操作中檢索多行。該選項與 crecordset::optimizebulkadd 是互斥的。請注意,如果指定 crecordset::usemultirowfetch,則會自動開啟選項 crecordset::nodirtyfieldcheck(雙緩沖將不可用);在只向前滾動記錄集上,將自動開啟選項 crecordset::useextendedfetch。 crecordset::skipdeletedrecords 在記錄集內導航時跳過已刪除的記錄。這會降低某些相關提取的性能。該選項在只向前滾動記錄集上無效。請注意,crecordset::skipdeletedrecords 與“驅動程序包裝”類似,這意味著刪除過的行已從記錄集內刪掉了。 crecordset::usebookmarks 如果支持的話,可以在記錄集上使用書簽。書簽會降低數據檢索的速度,但會改進數據導航的性能。在只向前滾動記錄集上書簽無效。 crecordset::nodirtyfieldcheck 關閉自動的 dirty 字段檢查(雙緩沖)。這將改進性能;但您必須通過調用setfielddirty 和 setfieldnull 成員函數,手工將字段標志為 dirty。 crecordset::executedirect 不使用已準備好的 sql 語句。在需改進性能時,如果不調用 requery 成員函數,就請指定該選項。 crecordset::useextendedfetch 執行 sqlextendedfetch 而不是 sqlfetch。這是用于在只向前滾動記錄集上執行大量行提取而設計的。如果在只向前滾動記錄集上指定選項 crecordset::usemultirowfetch,則會自動開啟 crecordset::useextendedfetch。 crecordset::userallocmultirowbuffers 用戶將為數據分配存儲緩沖區。如果想自己分配存儲量,應將該選項與 crecordset::usemultirowfetch 一起使用;否則,框架將自動分配必要的存儲量。 
如果您愿意的話,可以使用大量行提取改進性能。在打開記錄集對象前,可以用 setrowsetsize 成員函數定義行集的大小。行集的大小指定了一次提取應檢索多少條記錄。執行大量行提取時,默認行集大小為 25。請注意。如果不執行大量行提取,行集的大小保持固定值 1。 
在將行集大小初始化后,應調用 open 成員函數。在此處您必須指定 dwoptions 參數的 crecordset::usemultirowfetch 選項,以執行大量行提取。另外,還可以設置 crecordset::userallocmultirowbuffers 選項。大部分記錄字段交換機制在提取期間均用數組來存儲檢索到的多行數據。這些存儲緩沖區可由框架自動分配,或者您也可以手工分配它們。指定 crecordset::userallocmultirowbuffers 選項就意味著要由您進行分配。 
優化 dao 數據庫和記錄集對象 
如果使用 cdaodatabase 對象,您應使用一個字符串表達式,該表達式是現有 microsoft jet (.mdb) 數據庫文件的名稱。如果文件名有擴展名,則要求帶其擴展名。如果您的網絡支持統一命名約定 (unc),則還可以指定網絡路徑,如“////myserver//myshare//mydir//mydb.mdb”。(雙反斜線是字符串文字中所要求的,因為“/”是 c++ 的轉義符。) 當以這種方式使用數據庫時,有一些需要注意的事項。 
如果某個數據庫已由另一個用戶以獨占訪問形式打開,mfc 就會拋出一個異常錯誤。使用該異常錯誤可以讓您的用戶知道該數據庫是不可訪問的。 
如果您用空字符串 ("") 打開數據庫,并正在連接到 odbc 數據源,就會顯示一個對話框,框中列出所有已注冊的 odbc 數據源名稱,以便用戶選擇數據庫。應避免與 odbc 數據源直接連接;而是使用鏈接的表。 
cdaodatabase 對象可以以獨占訪問的方式打開。默認情況下,它是以共享訪問的方式打開的。可以將它作為只讀數據源打開,也可以以讀/寫訪問方式打開。所有由 cdaodatabase 對象派生的記錄集都繼承該數據庫對象的讀取能力。 
與 crecordset 對象一樣,cdaorecordset 有多種類型。如果選擇 dbopendynaset,您就得到可以雙向滾動的動態集類型的記錄集。這是默認選項。如果選擇 dbopensnapshot,您得到的就將是可以雙向滾動的快照類型的記錄集。最后,使用 dbopentable 可以打開能雙向滾動的表類型的記錄集。無法用 mfc odbc 數據庫類打開基于表的記錄集。 
cdaorecordset 對象所具有的選項與 crecordset 對象的選項類似。 dbappendonly 您只可追加新記錄(只限動態集類型的記錄集)。該選項的字面意思是記錄只可以被追加。mfc odbc 數據庫類有只追加選項,該選項允許對記錄進行檢索和追加。 dbforwardonly 記錄集是只向前滾動的快照。 dbseechanges 如果另一個用戶要更改您正在編輯的數據,就會生成一個意外錯誤。 dbdenywrite 其他用戶無法修改或添加記錄。 dbdenyread 其他用戶無法查看記錄(只限表類型記錄集)。 dbreadonly 您只可查看記錄;而其他用戶可修改它們。 dbinconsistent 允許不一致的更新(只限動態集類型記錄集)。 dbconsistent 只允許一致的更新(只限動態集類型記錄集)。備注 常量 dbconsistent 和 dbinconsistent 是互斥的。在給定的 open 實例中只可使用兩者中的某一個,而不能同時使用。 
優化基于 odbc 的數據庫交互 
下面的建議適用于任何涉及 odbc 的交互。這不僅適用于 odbc 數據庫類,而且對那些與基于服務器的數據一起使用的 dao 數據庫類(dao 使用 odbc 與數據源進行通信)也適用。這些建議中有很多都是來自于 colleen lambert 的文章“odbc:architecture,performance,and tuning”(位于 microsoft developer network 光盤)。 通過查詢驅動程序一致性級別而盡可能多地利用驅動程序的能力。如果不需要將應用程序移植到另一個平臺,就可以通過著重關注某個特定驅動程序的能力,使您應用程序的性能達到最佳狀態。 避免調用數據源目錄例程。這些例程可能會很耗時。試著調用例程一次,并將信息在本地高速緩存。 牢記可伸縮性,并適當地在本地和遠程存放數據。設法避免在二進位組合碼框中填入來自遠程數據源的數據。 將 sqlextendedfetch 用于滾動。如果您的驅動程序支持它,這是對 odbc 數據源進行來回滾動的最快方法。 已準備好的 sql 語句運行得更快。花費一些時間準備 sql 調用,以便它們附加到 hstmt 上。只有該句柄釋放后,它們才會被釋放。 使用 sqlbindcol 而不是 sqlgetdata。sqlbindcol 負責列的存儲和數據類型,這樣您就不必為結果集而重新獲得它。 將 sqltypeinfo 在本地高速緩存。某些數據源將該調用作為存儲過程進行處理,這執行起來可能會很耗費成本。 盡量少使用連接,并避免反復地斷開連接和重新連接。請記住,除 odbc 驅動程序進行的調用外,它的管理器也進行調用以準備連接。所有這種開銷加起來就可能大幅度降低應用程序的速度。 將塊提取用于多級驅動程序。多級驅動程序經常將網絡性能當作自己工作的一部分使用,并且,依賴于 sqlfetch 而不是 sqlextendedfetch 會使您的應用程序遭受網絡操作奇特行為的影響。 通過全面了解您的 sql 來優化查詢。這可能看似顯而易見,但許多程序員實際上只了解有限數量的 sql 命令。而對 sql 語句的進一步學習與精通,可能會使得應用程序有快與更快之分。 使用高性能的 dbms。我們在本白皮書的開頭就談到了這個問題,好的數據源是應用程序的能力與操作的基礎。在您的客戶端負擔得起的前提下,使用最好的數據源。 
下面的建議是專用于 dao 數據庫類的。該列表中帶星號的項主要是指與 odbc(基于服務器)數據源的交互。 盡可能使用鏈接的表而不是直接打開的表。請參見 dao“幫助”中的文章“dao external:working with external data sources and the topic accessing external databases with dao”。在此列表的所有建議中,這項建議對性能的影響最為顯著。* 如果不更新數據,就不要使用動態集類型的記錄集。如果只向前滾動,就使用向前滾動的快照類型的記錄集。不必要的話不要從頭至尾滾動記錄,還要避免跳到大型表的最后一條記錄。 只檢索與查看需要的數據。用受限查詢來限制要檢索的記錄數量,并且只選擇您需要的列。這樣會使得要求通過網絡傳輸的數據更少。 使用高速緩沖。在類 cdaorecordset 中,mfc 支持對指定數量的記錄進行高速緩存。一開始在將數據檢索到高速緩存中時,這樣做花費的時間會較長;但在高速緩存中移動并滾動(已檢索的)記錄要比滾動檢索每條記錄快一些。* 關閉 mfc cdaorecordset 對象中的雙緩沖選項。這是改進性能的常規方法,也適用于使用外部數據源的情況。 對于量比較大的操作,如大量添加記錄,請使用 sql 直接傳遞查詢。當使用 sql 直接傳遞查詢時,只要您始終通過同一連接執行 sql 直接傳遞查詢,就只需一次性地設置連接信息即可。* 
避免使用會導致本地處理的查詢。* 不要使用含有遠程列參數的用戶定義函數。只在索引列上使用異類聯接(在兩個數據庫中的表上聯接),并且,如果您這樣做的話,請注意到某些處理是在本地完成的。當訪問外部數據時,只有在外部數據庫無法執行操作時,microsoft jet 數據庫引擎才會在本地處理數據。在本地執行的查詢操作有: 查詢頂部含有 distinct 謂詞的 where 子句限制。通常,您可以重新安排查詢,以計算合計或在所有其它操作后的 distinct 查詢數量。 含有無法遠程處理的操作的 where 子句,如涉及到遠程列的用戶定義函數。(請注意,這種情況下,只有那些無法遠程處理的 where 子句部分將在本地處理。) 來自不同數據源的表之間的聯接。僅靠來自不同數據源的表之間存在聯接這一個條件,并不能斷定所有處理都會在本地發生。如果將限制發送給服務器,則只有相關的行會在本地處理。 在聚合或 distinct 謂詞上的聯接。無論如何,正確地聯接都是一門藝術,添加聚合函數(如 avg、max 和 min)或含有 distinct 的謂詞只會減慢查詢。 含有不為 odbc 驅動程序所支持的語法的外聯接。桌面數據庫驅動程序不僅支持左向外聯接和右向外聯接,還支持內聯接 左向外聯接中的右表和右向外聯接中的左表都可用于內聯接中。完全的和嵌套的外聯接都不受支持。 
接下來的三項專用于您想要從遠程數據源訪問的數據。 含有無法遠程處理的操作的 distinct 謂詞。 order by 參數(如果遠程數據源不支持它們)。 含有無法遠程處理的操作的 order by 或 group by 參數。 “不可遠程處理的”表達式是無法由您的服務器求值的。不可遠程處理的輸出表達式(select 子句中的那些表達式)不強制對您的查詢進行本地求值,除非這些表達式出現在合計查詢、distinct 查詢或 union 查詢中。其它子句(如 where、order by、group by、having 等)中的不可遠程處理的表達式至少強制您的部分查詢在本地求值。 查詢頂部含有 distinct 選項的 group by 參數。使用 select distinctrow,后跟 group by 子句。 
下面的功能在所有已知的 odbc 可訪問的服務器上都是不被支持的 - 通常是一些這樣的操作:它們是 microsoft jet 特有的對 sql 的擴展,如: 多級別 group by 參數,如在含有多個分組級別的報告中使用的參數。 top 或 top percent 謂詞。 有多個聚合的交叉表查詢或含有與 group by 子句匹配的 order by 子句的交叉表查詢。簡單的交叉表查詢可以發送到服務器。 
其它用于優化應用程序的資源 
visual c++ 隨帶的文檔應是關于 mfc 實現 dao 的第一個信息來源。不僅應該查閱 mfc dao 示例和 mfc 技術說明,還應查閱 class library reference 和 programming with mfc。 
有關 dao 工作方式的其它信息,請查閱 microsoft jet database engine programmer's guide(microsoft press 出版)。 
另外還有兩篇推薦文章,均位于 microsoft developer network 光盤上,它們是: “jet database engine odbc connectivity”,作者:black、neil 和 stephen hecht。 
這篇文章詳細講述了 microsoft jet 如何使用 odbc 檢索服務器數據。對于所有用 dao 編寫重要服務器應用程序的人,這都不失為一篇必讀文章。
“odbc:architecture,performance,and tuning”,作者:lambert、colleen。 
本白皮書提供對 odbc 工作方式的良好概述,并以現實、有用的方式講述了性能問題。
結論 
mfc 的基本概念(即為更復雜的技術提供高級別抽象)在這些數據庫類中是可以實現的。您可以選擇 odbc 或是 dao,以獲得可使客戶端成功的最佳路徑。 
我們花了相當多的時間檢查改進性能的方法,看到了一些與在許多數據源上類的執行方式有關的方法,并向您提出了許多要考慮的問題。不管您做什么,在決定以前都請保持原型。我們希望今天的會議能幫助您縮小選擇范圍,并使您的決定更容易實現。
菜鳥學堂: