詳細(xì)說明ADO.NET應(yīng)用程序進(jìn)行使用
下一示例以上例為基礎(chǔ),將四個(gè)表關(guān)聯(lián)在一起,并瀏覽這些關(guān)系。如上例所示,CustomerID使Customers表與Orders表相關(guān)聯(lián)。對于Customers表中的每個(gè)客戶,將確定Orders表中的所有子行,以返回特定客戶的訂單數(shù)以及他們的OrderID值。
該擴(kuò)展示例還將返回OrderDetails表和Products表中的值。Orders表使用OrderID與OrderDetails表相關(guān)聯(lián),以確定在每一客戶訂單中訂購的產(chǎn)品及數(shù)量。由于OrderDetails表只包含已訂購產(chǎn)品的ProductID,OrderDetails將使用ProductID與Products相關(guān)聯(lián),以返回ProductName。在這一關(guān)系中,Products表為父表,而OrderDetails表為子表。因此,當(dāng)循環(huán)訪問OrderDetails表時(shí),將調(diào)用GetParentRow來檢索相關(guān)的ProductName值。#t#
請注意,當(dāng)為Customers表和Orders表創(chuàng)建ADO.NET DataRelation時(shí),沒有為createConstraints標(biāo)志指定任何值(默認(rèn)為true)。它假定Orders表中的所有行都具有一個(gè)存在于父Customers表中的CustomerID值。如果CustomerID存在于Customers表之外的Orders表中,則ForeignKeyConstraint將引發(fā)異常。
如果子列可能包含父列不包含的值,添加DataRelation時(shí)請將createConstraints標(biāo)志設(shè)置為false。在該示例中,對于Orders表和OrderDetails表之間的DataRelation,createConstraints標(biāo)志將設(shè)置為false。這樣,應(yīng)用程序就可以返回OrderDetails表中的所有記錄并只返回Orders表中記錄的子集,而不會生成運(yùn)行時(shí)異常。該擴(kuò)展示例生成以下格式的輸出。
ADO.NET應(yīng)用程序要從數(shù)據(jù)源里讀取數(shù)據(jù),首先得創(chuàng)建一個(gè)連接對象.這個(gè)連接對象可以是SQLConnection 或是 ADOConnection,這取決于所采用的目標(biāo)提供程序. 需要記住的是,雖然在這里不做推薦,但你也可以利用ADO .NET 類來連接到SQL Server數(shù)據(jù)庫. 這種方法***不足是,代碼需要通過一個(gè)不必要的額外代碼層. 首先它會調(diào)入ADO的托管提供程序, 然后ADO的托管提供程序再調(diào)用SQL Server OLE DB 提供程序. 如同OLE DB 提供程序做的一樣,SQL Server 托管提供程序會直接操作數(shù)據(jù)。#t#
在這些數(shù)據(jù)提供者中都有一個(gè)DataAdapter類,如:OLE DB .NET Framework 數(shù)據(jù)提供者中是 OleDbDataAdapter類,The SQL Server .NET Framework 數(shù)據(jù)提供者中是SqlDataAdapter類,The ODBC .NET Framework 數(shù)據(jù)提供者中是OdbcDataAdapter類。通過這些DataAdapter就能夠?qū)崿F(xiàn)從數(shù)據(jù)庫中檢索數(shù)據(jù)并填充 DataSet 中的表。