欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Scott Mitchell 的ASP.NET 2.0數據教程之70:為D

系統 2166 0

本文英文原版及代碼下載:
http://www.asp.net/learn/data-access/tutorial-70-cs.aspx

Scott Mitchell 的ASP.NET 2.0數據教程之70:為DataTable添加額外的列


導言:

當向類型化的數據集(Typed DataSet)添加一個TableAdapter時,相應的DataTable的構架已經由TableAdapter的主查詢定義好了.比如,如果主查詢返回A, B,C這3個域,那么 DataTable將有對應的3個列A, B,和C.除了主查詢以外,TableAdapter還可以包含其他的查詢,可能是返回基于某些參數的數據。比如,ProductsTableAdapter的主查詢返回所有產品的信息,此外,ProductsTableAdapter還包含諸如GetProductsByCategoryID(categoryID) 和 GetProductByProductID(productID)的方法,它們根據指派的參數返回特定的產品信息.

如果TableAdapter的方法返回的列涵蓋在主查詢里,工作起來沒有問題。但如果返回的列并沒有涵蓋在主查詢,那么我們就需要對DataTable的構架進行擴充.在第35章《Master/Detail Using a Bulleted List of Master Records with a Details DataList》里,我們向CategoriesTableAdapter添加方法以返回 CategoryID, CategoryName, Description和NumberOfProducts列。其中前3列是涵蓋在主查詢里的,而NumberOfProducts列沒有在主查詢里定義,它返回的是每個category相關產品的數目.我們可以向CategoriesDataTable手工添加一列,以便于統計從新方法返回的NumberOfProducts列的值.


在第54章《Uploading Files》我們探討過,對使用ad-hoc SQL statements構建且其方法返回的列超出主查詢范圍的TableAdapters必須多加留意.因為一旦重新運行設置向導的話,它將對TableAdapter的方法進行更新,使其返回的列與主查詢相匹配.不過如果使用存儲過程的話就不會出現這種情況.

在本文我們將考察如何擴展DataTable的構架以包含額外的列。我們都知道使用ad-hoc SQL statements構架的TableAdapter不穩定,本文我們將用存儲過程來構架.你可以參考第67章《the Creating New Stored Procedures for the Typed DataSet’s TableAdapters》和第68章《Using Existing Stored Procedures for the Typed DataSet’s TableAdapters》來獲取設置TableAdapter使用存儲過程的更多信息.


第一步:向ProductsDataTable添加一個PriceQuartile列

在第67章里我們創建了一個名為NorthwindWithSprocs的類型化的數據集.該數據集目前包含2個DataTables:ProductsDataTable以及 EmployeesDataTable。
其中ProductsTableAdapter包含3個方法:

.GetProducts——主查詢,返回Products表的所有記錄
.GetProductsByCategoryID(categoryID)——根據指定的categoryID值返回所有產品
.GetProductByProductID(productID)——根據指定的productID值返回所有的產品

主查詢及另外2個方法都返回相同的數據列,也就是Products表的所有列,并沒有返回Categories 以及Suppliers表的相關數據.


在本文,我們將向ProductsTableAdapter添加一個名為GetProductsWithPriceQuartile 的方法,它返回所有的產品.除了標準的數據列外,它還返回PriceQuartile列,它用四分位數來衡量產品價格下跌程度.如果產品價格上升了25%,那么其值為1,如果下降為25%,那么其值為4.在我們創建一個存儲過程來返回這種信息之前,我們首先需要更新ProductsDataTable,新添一列來包含GetProductsWithPriceQuartile方法返回的 PriceQuartile值.

打開NorthwindWithSprocs數據集,在ProductsDataTable上右鍵單擊,選擇“ Add” ,再選擇“Column”.

Scott Mitchell 的ASP.NET 2.0數據教程之70:為DataTable添加額外的列

圖1:向ProductsDataTable新添一列

這將向DataTable新添一列,名為“Column1”,類型為System.String.我們需要將該列的名稱改為“PriceQuartile”,類型改為System.Int32,因為它的值介于1到4之間.在ProductsDataTable 選中我們新添加的列,在屬性窗口里設置其Name屬性為 “PriceQuartile”,DataType屬性為System.Int32.

Scott Mitchell 的ASP.NET 2.0數據教程之70:為DataTable添加額外的列

圖2:設置該新列的Name 和 DataType屬性

就像圖2所示,我們還可以設置其它的屬性.比如,是否該列的值必須為unique;如果該列為自增列,其值是否允許為NULL等等.不過我們這里使用其默認值.


第二步:創建GetProductsWithPriceQuartile方法

現在我們已經對ProductsDataTable進行了更新以包含PriceQuartile列,我們將要創建一個GetProductsWithPriceQuartile方法.在TableAdapter上單擊右鍵,再選擇“Add Query”.這將開啟TableAdapter查詢設置向導,它首先詢問我們是使用ad-hoc SQL statements還是使用現有的存儲過程或新建一個存儲過程.我們選擇“Create new stored procedure”,再點Next.

Scott Mitchell 的ASP.NET 2.0數據教程之70:為DataTable添加額外的列
圖3:在TableAdapter向導里創建新的存儲過程


接下來,如圖4所示,向導詢問我們添加的是那種類型的查詢,由于GetProductsWithPriceQuartile方法將返回Products表的所有記錄以及所有列,我們選擇“SELECT which returns rows”項,再點Next.

Scott Mitchell 的ASP.NET 2.0數據教程之70:為DataTable添加額外的列

圖4:查詢將是一個返回多個行的SELECT Statement

接下來,我們在向導里鍵入如下的查詢:

SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued,
NTILE(4) OVER (ORDER BY UnitPrice DESC) as PriceQuartile
FROM Products


上述查詢使用了SQL Server 2005新增的NTILE function函數,它將結果劃分為4組,將UnitPrice值按降序分組.

不幸的是,查詢構造器(Query Builder)不能解析關鍵字OVER,并拋出一個錯誤信息。因此,直接在向導的文本框里鍵入上述代碼,而不要使用查詢構造器.
注意:
關于NTILE以及SQL Server 2005的其它函數的更多信息,你可參閱文章《Returning Ranked Results with Microsoft SQL Server 2005》( http://www.4guysfromrolla.com/webtech/010406-1.shtml )以及SQL Server 2005 Books Online的《Ranking Functions section》部分( http://msdn2.microsoft.com/en-us/library/ms189798.aspx )

完成后,點Next, 向導將要我們為新存儲過程重命名,我們取名為Products_SelectWithPriceQuartile再點Next.

Scott Mitchell 的ASP.NET 2.0數據教程之70:為DataTable添加額外的列
圖5:將新存儲過程命名為Products_SelectWithPriceQuartile

最后我們要為TableAdapter的方法命名,選中“Fill a DataTable” 和 “Return a DataTable”兩項,并重命名為 FillWithPriceQuartile 和GetProductsWithPriceQuartile.

Scott Mitchell 的ASP.NET 2.0數據教程之70:為DataTable添加額外的列
圖6:對TableAdapter的方法命名并點Finish

當指定了SELECT查詢,并對存儲過程和TableAdapter的方法命名后,點Finish完成向導。這時你將看到1到2條警告信息,說“The OVER SQL construct or statement is not supported.” 不必理會它.

完成向導后,該TableAdapter將會包含FillWithPriceQuartile 和GetProductsWithPriceQuartile方法,并且數據庫將包含一個名為Products_SelectWithPriceQuartile的存儲過程。花點時間來驗證一下,檢查數據庫,如果你沒有看到我們剛添加的存儲過程,在存儲過程文件夾上右鍵單擊,選“刷新”.

Scott Mitchell 的ASP.NET 2.0數據教程之70:為DataTable添加額外的列

圖7:驗證新方法是否添加到TableAdapter

Scott Mitchell 的ASP.NET 2.0數據教程之70:為DataTable添加額外的列

圖8:確保數據庫包含Products_SelectWithPriceQuartile存儲過程


注意:

使用存儲過程來替換ad-hoc SQL statements的好處之一是重新運行TableAdapter設置向導的話并不會改動存儲過程返回的列.我們可以作一個驗證,在TableAdapter上右鍵單擊,選“Configure”項,以啟動向導,然后點Finish完成向導。接下來,我們在數據庫里查看Products_SelectWithPriceQuartile存儲過程.我們注意到其返回的列并沒有發生變化.如果我們使用的是ad-hoc SQL statements的話,重新運行向導將會使查詢返回的列與主查詢的列相匹配,因此它將把GetProductsWithPriceQuartile方法里使用的查詢里的NTILE statement刪除掉.

當調用數據訪問層的GetProductsWithPriceQuartile方法時,TableAdapter將執Products_SelectWithPriceQuartile存儲過程,并為返回的每條記錄向ProductsDataTable添加對應的row.存儲過程返回的數據域(data fields)將映射到ProductsDataTable的列.因為該存儲過程要返回一個PriceQuartile數據域,所以它的值將分配給ProductsDataTable的PriceQuartile列.


對于那些不返回PriceQuartile數據域的方法而言,PriceQuartile列的值由其DefaultValue屬性指定. 如圖2所示,該默認值為DBNull。如果你想指定為其他值,僅僅改動DefaultValue屬性即可,但一定要是一個有效的值(比如,PriceQuartile列的值一定要是一個System.Int32類型的值).

現在我們完成了向DataTable添加額外列的必要的步驟,接下來我們要創建一個ASP.NET 頁面來展示每個產品的 name, price,以及price quartile.不過我們要先對業務邏輯層進行更新,以包含一個方法來調用數據訪問層的GetProductsWithPriceQuartile方法.我們將在第3步更新業務邏輯層,在第4步創建一個ASP.NET頁面.


第三步:更新業務邏輯層

我們在表現層調用新添加的GetProductsWithPriceQuartile方法以前,必須在業務邏輯層添加相應的方法,打開ProductsBLLWithSprocs class類文件,添加如下的代碼:

[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, false)]
public NorthwindWithSprocs.ProductsDataTable GetProductsWithPriceQuartile()
{
return Adapter.GetProductsWithPriceQuartile();
}


就像其它方法一樣,GetProductsWithPriceQuartile僅僅調用數據訪問層對應的GetProductsWithPriceQuartile方法并返回其結果.


第四步:在一個ASP.NET頁面展示Price Quartile信息

完成對業務邏輯層的修改后,我們將創建一個ASP.NET頁面來顯示每個產品的price quartile信息.打開AdvancedDAL文件夾里的AddingColumns.aspx頁面,從工具箱拖一個 GridView控件到頁面,設置其ID為Products.在其智能標簽里將其綁定到一個名為ProductsDataSource的新的ObjectDataSource控件,設置該控件調用ProductsBLLWithSprocs class類的GetProductsWithPriceQuartile方法,在UPDATE, INSERT,和DELETE標簽里選“(None)”.

Scott Mitchell 的ASP.NET 2.0數據教程之70:為DataTable添加額外的列
圖9:設置ObjectDataSource調用ProductsBLLWithSprocs類

Scott Mitchell 的ASP.NET 2.0數據教程之70:為DataTable添加額外的列
圖10:調用GetProductsWithPriceQuartile方法獲取產品信息

完成設置向導后, Visual Studio會為GridView添加BoundField或CheckBoxField列,其中包括PriceQuartile列. 將ProductName, UnitPrice,PriceQuartile以外的列全部刪除,設置UnitPrice列為貨幣格式.并將UnitPrice 和 PriceQuartile列放在右邊,居中。 最后分別將這3列的HeaderText屬性設置為“Product”, “Price”,“Price Quartile”。同時啟用GridView控件的排序功能.

作上述修改后, GridView 和 ObjectDataSource控件的聲明代碼看起來和下面的差不多:

<asp:GridView ID="Products" runat="server" AllowSorting="True"
AutoGenerateColumns="False" DataKeyNames="ProductID"
DataSourceID="ProductsDataSource">
<Columns>
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}"
HeaderText="Price" HtmlEncode="False"
SortExpression="UnitPrice">
<ItemStyle HorizontalAlign="Right" />
</asp:BoundField>
<asp:BoundField DataField="PriceQuartile" HeaderText="Price Quartile"
SortExpression="PriceQuartile">
<ItemStyle HorizontalAlign="Center" />
</asp:BoundField>
</Columns>
</asp:GridView>

<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetProductsWithPriceQuartile"
TypeName="ProductsBLLWithSprocs">
</asp:ObjectDataSource>

如圖11為在瀏覽器里登錄該頁面的情況,我們注意到,最開始產品按price的降序排列,同時每個產品都有相應的PriceQuartile值,當然這些數據也可以按其它標準來排序,如圖12所示。

Scott Mitchell 的ASP.NET 2.0數據教程之70:為DataTable添加額外的列
圖11:產品按Prices來排序

Scott Mitchell 的ASP.NET 2.0數據教程之70:為DataTable添加額外的列

圖12:產品按名稱來排序.

注意:
只需要很少的代碼,我們就可以根據每行PriceQuartile值的不同而顯示不同的顏色,比如對值為1的行顯示為淺綠色,對值為2的行顯示為淺黃色,以此類推.你可以花點時間來實現該功能,如果有必要的話,你可以參閱第11章《Custom Formatting Based Upon Data》


另一種途徑——創建另一個TableAdapter

正如我們在本文看到的,當向TableAdapter添加的方法返回的列超出了主查詢范圍的時候,我們可以向DataTable添加相應的列即可.對TableAdapter而言,如果當其包含的返回“額外列”的方法較少且“額外列”不是很多的時候,這種途徑才能正常工作。


除了往DataTable添加列以外,我們還可以對DataSet添加另外的TableAdapter,其包含的方法就是那些需要返回“額外列”的方法.就本問而言,我們可以向DataSet添加另一個名為ProductsWithPriceQuartileTableAdapter的TableAdapter,它將Products_SelectWithPriceQuartile存儲過程作為它的主查詢,對要獲取price quartile信息的ASP.NET頁面來說,只需調用 ProductsWithPriceQuartileTableAdapter即可;而不需要獲取price quartile信息的頁面只需要調用ProductsTableAdapter即可.

這種另外新添加的TableAdapters可能導致某些功(functionality)、作業(task)重復.比如,如果那些展示PriceQuartile列的頁面也要啟用insert, update,delete功能的話,那么就要對ProductsWithPriceQuartileTableAdapter的InsertCommand, UpdateCommand,DeleteCommand屬性進行適當的設置.而我們已經對ProductsTableAdapter的這3個屬性進行過設置了,這時就有2種方法來對數據庫里的產品進行添加、更新、刪除操作了——使用ProductsTableAdapter類或 ProductsWithPriceQuartileTableAdapter類.

本文供下載的代碼里,在NorthwindWithSprocs數據集里包含了ProductsWithPriceQuartileTableAdapter class類,演示了這2種方法.


總結:

在大多數情況下,TableAdapter的所有方法返回的數據列都是相同的,但有極少數方法會返回主查詢沒有包含的“額外列”.比如我們在第35章《Master/Detail Using a Bulleted List of Master Records with a Details DataList》里,我們向CategoriesTableAdapter添加了一個方法,該方法除了返回主查詢里的列外,還返回了一個NumberOfProducts列.而在本文,我們考察類了向 ProductsTableAdapter 添加一個方法以返回一個沒有包含在主查詢里的PriceQuartile列.對這種返回來的“額外列”,我們需要向DataTable添加一個對應的列.

如果你打算手工向DataTable添加列,我們建議一使用存儲過程.如果用ad-hoc SQL statements的話,任何時候只要重新運行TableAdapter設置向導,用戶所做的所有定制都要被覆蓋.而用存儲過程的話就不會出現這種情況.


祝編程快樂!


作者簡介
Scott Mitchell,著有六本ASP/ASP.NET方面的書,是4GuysFromRolla.com的創始人,自1998年以來一直應用 微軟Web技術。Scott是個獨立的技術咨詢顧問,培訓師,作家,最近完成了將由Sams出版社出版的新作,24小時內精通ASP.NET 2.0。他的聯系電郵為 mitchell@4guysfromrolla.com ,也可以通過他的博客 http://ScottOnWriting.NET 與他聯系。

Scott Mitchell 的ASP.NET 2.0數據教程之70:為DataTable添加額外的列


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品久久久久久亚洲调教 | 欧美日韩一区二区三区自拍 | 91网在线观看 | 91传媒蜜桃香蕉在线观看 | 四虎在线免费观看 | 久久国产一区 | 天天干天天操 | 久久综合九色综合欧洲 | 久久国产免费观看精品 | 国产成久久免费精品AV片天堂 | 精品综合久久久久久99 | 婷婷激情网站 | 一区二区三区网站在线免费线观看 | 久久精品国产精品青草图片 | 99精品视频在线观看 | 先锋影音资源网站 | 国产三级在线观看视频 | 成年在线视频免费视频观看 | 九九九视频 | 天天做天天添天天谢 | 中文字幕在线看 | a级片在线免费观看 | 国产精品久久人妻无码网站一区无 | 久久草在线 | 91影院| 波多野结衣一区2区3区 | 午夜资源在线 | 午夜av毛片 | 国产乱肥老妇国产一区二 | 久久亚洲一区二区 | 成人免费网站视频 | 日本色综合 | 亚洲精品一区二区三区在线观看 | 热re66久久精品国产99re | 免费视频91 | 天天色亚洲 | 91丁香亚洲综合社区 | 伦理一区 | 国产精品久久久久久久久 | 狠狠色狠狠色综合久久第一次 | 四虎精品8848ys一区二区 |