国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

在Microsoft Office System中使用ADO.NET數據集(三)

2024-07-10 13:03:17
字體:
來源:轉載
供稿:網友
到這一步,你的dataset應該完全被來自數據庫中的數據填充了,因此你可以關閉數據庫連接對象。盡可能早的關閉連接永遠是一個好的編程習慣,這樣你可以將它釋放給其他應用程序。另一方面,如果當前程序將要立即使用這個連接——也許是為了創建另一個dataset,你可以保持它為打開狀態以避免重建該連接帶來的額外開銷。

注意:如果你在該應用程序中對每個連接重用完全相同的連接字符串——包括嵌套空間,默認情況下,ado.net將共用同一個連接。因此在大多數情況下,關閉和重新打開一個連接只會導致非常小的開銷(可以忽略不計)。

我們可以說,現在你的dataset已經填充完畢,并且準備好以供使用,同時從數據庫斷開了連接。在許多應用程序程序中,這些就是你所需要的,但是你可能希望創建多種關系,用以建立數據的分級特性。創建這些關系需要使用datarelation類。

重點 即使你在你的數據庫中定義了相關的完整性關系,你也沒有方法在一個dataset中自動重建這些關系——換句話說,你必須手工創建這些關系。



創建一個數據關系需要引用dataset中現存表兩個以上的列。下面的代碼中使用parent和child datacolumn對象來在兩個表中的主鍵與外鍵之間添加關系。一旦你實例化這些對象(parent和child對象),你就可以實例化datarelation對象,并傳遞給其一個名字,用以標識關系屬于parent 和child 對象。

代碼還設置關系的nested(嵌套)屬性為 true.當你讀取該dataset的xml表示時,child元素并不會自動嵌套到它的parent對象中。相反,所有的parent元素先被列出來,所有的child元素緊隨其后,并按層次進行分組。雖然種非常有用的結構是罕見的,但是nested屬性嵌套了數據。

最后一步,添加新的datarelation對象到該dataset對象的relations集合中。注意到,代碼中是使用表的名字作為引用表識的。你可以將它們替換為你自己的表的名字。

'add the relationships to the dataset

'customers -> orders

dim parent as datacolumn = _

ds.tables("customers").columns("customerid")

dim child as datacolumn = ds.tables("orders").columns("customerid")

dim sqlrel as new datarelation("customer orders", parent, child)

sqlrel.nested = true

ds.relations.add(sqlrel)

該過程的最后一步將dataset對象的xml架構和數據保存到硬盤上。使用dataset時這一步不是必須的,但是在“將dataset作為xml導入到excel 2003 worksheet”節,你將看到如何使用它們。

大多數.net frameword對象支持序列化成一維或多維,但是,dataset對象使序列化變得更為簡單——使用writexml和writexmlschema方法就能做到。當你調用這兩個方法使,需要傳遞相應磁盤文件的名字給每個方法,數據就保存到相應的文件中。你可以提供完整路徑,但是這段代碼將文件保存到應用程序的bin文件夾。在這里有用到表名稱作為引用標志。

‘可選步驟:將xml數據和架構保存為磁盤文件

if bsaveschema then

'places the file in this app's bin directory

ds.writexmlschema("customers.xsd")

ds.writexml("customers.xml")

end if

該過程將完整的dataset對象返回給調用它的過程。

return ds

end function

為單一實體創建dataset

當你在一個客戶端應用程序中創建一個dataset時,ado.net將來自數據庫的所有數據通過網絡傳遞到客戶端,并盡最大可能將必需數據完全填充到這個dataset中。

如果你的表有數百萬條記錄,將會發生什么?你希望通過網絡傳遞盡可能少的數據填充到dataset中,例如,你很可能僅僅希望得到單一某個客戶的信息。在northwind數據庫中,數據訪問層的類方法getcustomerdataset就是實現這個功能的,它使用用戶從窗體上的下拉列表框中所選擇的customerid作為參數來選定某個特定客戶。

你需要的代碼與getdataset中的代碼極為類似,但是有一些重要的不同點。首先,你現在需要過濾數據。也就是說,你必須過濾表中的數據,以便只返回必需的記錄,并且對任何相關表都要執行這些操作,但是若有多個表一般就會返回多個記錄,例如:篩選出客戶已經下的訂單的某個(一個客戶可能下0個或多個訂單)。

你可以對dataset中所容納的數據執行篩選和排序,但是這意味著整個數據集都將穿越網絡。一個好的方式是在數據庫端執行篩選和排序,并且只返回必需的記錄。

你可以通過sqlparameter對象執行篩選。這些參數應用于代碼中的每個動態sql語句,注意,執行這樣的方法與調用相應的存儲過程是等效的。

下面的代碼填充dataset中的customers表。注意到現在的sql語句有一個where子句,沒有order by子句——對單一某個記錄是不必排序的。該sqlcommand對象和前面一樣的方式實例化,但是現在它需要設置@custid參數。sqlparameter對象用參數名——@custid,和參數類型——nchar(5)實例化。然后它設置參數的value屬性為傳遞到該過程的值。最后一步是添加這個新參數叨命令對象的parameters集合中,然后調用數據適配器的fill(同前面的步驟)。sql語句需要多少參數,你就可以添加多少參數對象。

dim sql as string = "select customerid, companyname, contactname, " _

contacttitle, address, city, region, postalcode, country, " _

& "phone, fax from customers where customerid = @custid"

dim sqlcmd as new sqlcommand(sql, sqlcnn)

dim sqlparam as new sqlparameter("@custid", sqldbtype.nchar, 5)

sqlparam.value = scustid

sqlcmd.parameters.add(sqlparam)

dim sqlda as new sqldataadapter(sqlcmd)

sqlda.fill(ds, "customers")

另一些表以幾乎完全相同方法填充,除了某些被過濾的表需要合并到orders表中,這樣customerid才可以訪問。

每個子表需要重用sqlparameter對象,因為它們都需要過濾customerid,而不僅僅只products表用到。你希望返回數據庫中的所有產品,而不管該產品是否被訂購。因此,該代碼的這個部分調用了parameters集合的clear方法。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彰化县| 富川| 延吉市| 南安市| 大庆市| 闽清县| 泸西县| 饶平县| 丹凤县| 临湘市| 凤冈县| 临朐县| 聂拉木县| 常熟市| 双牌县| 垫江县| 长宁区| 兴城市| 永泰县| 万山特区| 兴义市| 中方县| 开远市| 临江市| 武定县| 西藏| 渑池县| 疏勒县| 乌兰县| 偏关县| 巴南区| 蓝田县| 仁布县| 长子县| 交口县| 旅游| 隆昌县| 泽库县| 华安县| 当雄县| 云浮市|