大致說明ADODataset的結(jié)構(gòu)進行學習切磋
ADO DataSet的結(jié)構(gòu)允許基于查詢返回的結(jié)果創(chuàng)建Recordset。數(shù)據(jù)訪問引擎會檢查結(jié)果集中的數(shù)據(jù)列,并根據(jù)該信息填充Recordset對象的Fields集合,設(shè)置名稱、數(shù)據(jù)類型等。下面進行相關(guān)說明。
可以使用少數(shù)代碼行,讓ADO.NET自動檢查結(jié)果的結(jié)構(gòu);也可以使用較多代碼,其中包含了有關(guān)查詢結(jié)果結(jié)構(gòu)的元數(shù)據(jù)。
那么為什么要選擇需要編寫較多代碼的選項呢?最主要的優(yōu)點就在于其功能性更強、性能更佳。但是代碼較多時又怎么會使應用程序的運行速度更快呢?這似乎有悖于人們的直覺感受,不是嗎?
除非您正編寫一個專用查詢工具,否則您通常事先就知道查詢結(jié)果的結(jié)構(gòu)形式。例如,大多數(shù)ADO DataSet的結(jié)構(gòu)形式都與下例相似。Dim rs as Recordset'在此處聲明其他變量…初始化變量并與數(shù)據(jù)庫建立連接:
- rs.Open strSQL, cnDatabase, adOpenStatic, adLockOptimistic, adCmdText
- Do While Not rs.EOF
- List1.AddItem rs.Fields("UserName").Value
- rs.MoveNext
- Loop
在此代碼段中,編程人員知道該查詢包含一個名為UserName的列。關(guān)鍵就在于一個開發(fā)人員通常都知道查詢會返回哪些列,以及這些列使用何種數(shù)據(jù)類型。但是ADO并不能事先了解查詢結(jié)果的形式。結(jié)果,ADO必須對OLE DB提供程序進行查詢,提出諸如“查詢的結(jié)果中有多少列?
”,“這些列中每一列的數(shù)據(jù)類型是什么?”,“這些數(shù)據(jù)來自何方?”和“該查詢中所引用的每個表的主鍵字段是什么?”等問題。OLE DB提供程序可以回答這些問題中的一部分,但是很多時候它都必須回調(diào)數(shù)據(jù)庫。#t#
為獲取查詢結(jié)果,并且將該數(shù)據(jù)存儲在DataSet對象中,ADO DataSet的結(jié)構(gòu)需要知道此類問題的答案。您可以自己提供這些信息,也可以強制ADO.NET從提供程序獲取信息。當選擇自己提供信息時,代碼的運行速度就能加快,這是因為:與通過代碼提供元數(shù)據(jù)相比,在運行時向提供程序詢問此信息會使性能大幅降低。
盡管通過編寫代碼來準備ADO DataSet的結(jié)構(gòu)可以提高應用程序的性能,但編寫代碼可能非常沉悶乏味。幸運的是,Visual Studio包含了設(shè)計時數(shù)據(jù)訪問特性,這些特性為我們綜合了兩者***秀的性能。
例如,您可以創(chuàng)建一個基于查詢、表名稱或存儲過程的DataSet對象,然后配置向?qū)Ь蜁葾DO.NET代碼,來運行此查詢,并支持將更新提交給數(shù)據(jù)庫。在下面的章節(jié)中將會詳細討論許多此類Visual Studio特性。