欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
asp.net2.0數據訪(fǎng)問(wèn)(1)-入門(mén)-創(chuàng )建數據訪(fǎng)問(wèn)層
整個(gè)指南系列將從最簡(jiǎn)單的內容開(kāi)始,我們會(huì )首先創(chuàng )建一個(gè)數據訪(fǎng)問(wèn)層(DAL),在DAL中通過(guò)強類(lèi)型數據集(Typed DataSet)訪(fǎng)問(wèn)數據庫中的信息。
一、入門(mén)(introduction)
作為Web開(kāi)發(fā)者,我們會(huì )一直不斷的與數據打交道,比如:創(chuàng )建數據庫存儲數據;編寫(xiě)代碼訪(fǎng)問(wèn)和修改數據;通過(guò)Web頁(yè)面收集和匯總數據等等。
這個(gè)相對來(lái)說(shuō)比較長(cháng)的指南系列將會(huì )揭示asp.net2.0數據操作的通用模式。我們將從創(chuàng )建整個(gè)系列的軟件架構開(kāi)始。整個(gè)架構將包括DAL(通過(guò)強類(lèi)型數據集實(shí)現),BLL(展示業(yè)務(wù)邏輯規則)和UI(由asp.net頁(yè)面組成,而這些頁(yè)面又都共享使用一個(gè)模板來(lái)布局)。等這些基礎工作完成以后,將開(kāi)始展示數據,包括如何顯示、匯總、收集和驗證數據。
為了讓您了解的更加清楚,整個(gè)系列將會(huì )遵循簡(jiǎn)單明了和通過(guò)大量截圖分布演示的風(fēng)格來(lái)展現。每一篇文章都是用C#和VB.NET兩種語(yǔ)言編寫(xiě)代碼,你可以下載到相應語(yǔ)言的源代碼。(作者注:第一篇文章非常長(cháng),后面的就按內容分塊,相對更好理解一些)
在整個(gè)系列中,我們將會(huì )使用SQL SERVER 2005 Exdivss Edition中的示例數據庫Northwind,它會(huì )被放在項目的App_Date文件夾中,除了數據庫文件外,文件夾還包括創(chuàng )建數據庫用的SQL腳本,為您使用不同的數據庫版本提供了方便(如果你愿意的話(huà)),這些SQL腳本可以在微軟的官方網(wǎng)站下載。需要說(shuō)明的是,如果您選擇使用了一個(gè)不同的數據庫版本,需要修改Web.config文件中的NORTHWNDConnectionString的內容。整個(gè)Web應用程序通過(guò)VS2005專(zhuān)業(yè)版創(chuàng )建,項目類(lèi)型是一個(gè)基于文件系統的Web站點(diǎn)項目。當然,系列中的所有內容,都可以非常好地運行在其它免費地VS2005版本或者Visual Web Developer中。
在“入門(mén)”章節中,首先創(chuàng )建DAL,接著(zhù)第二篇文章創(chuàng )建BLL,第三篇開(kāi)始頁(yè)面布局和導航。前三篇文章將建立整個(gè)系列地基礎平臺。第一篇文章內容會(huì )稍微多一些,現在讓我們打開(kāi)VS開(kāi)始上路吧!
第1步:創(chuàng )建Web項目并連接數據庫
在我們建立DAL之前,首先創(chuàng )建一個(gè)站點(diǎn),并且安裝數據庫,下面創(chuàng )建一個(gè)新的基于文件系統的ASP.NET站點(diǎn)。操作如下:打開(kāi)VS的“文件”/“新建網(wǎng)站”菜單,顯示創(chuàng )建新網(wǎng)站對話(huà)框,選擇“asp.net web site”模板,在位置(location)下來(lái)列表中,選擇“文件系統”,選擇一個(gè)文件夾存放Web站點(diǎn),同時(shí)將語(yǔ)言改成C#.
圖1   創(chuàng )建新網(wǎng)站
上述步驟將創(chuàng )建一個(gè)新的Web站點(diǎn),包括一個(gè)Default.aspx頁(yè)面,一個(gè)App_Data文件夾和一個(gè)Web.config文件。
下一步是通過(guò)VS SERVER EXPLORER添加對數據庫的引用,通過(guò)往SERVER EXPLORE中添加數據庫,您可以添加表、存儲過(guò)程、視圖等等。您可以查看表中的數據,也可以手動(dòng)或通過(guò)QUERY BUILDER來(lái)創(chuàng )建查詢(xún),另外,我們可以指定用于創(chuàng )建強類(lèi)型數據集的數據庫。在我們提供數據庫連接字符串信息的同時(shí),VS會(huì )自動(dòng)裝載一個(gè)下拉列表用來(lái)展示已經(jīng)在SERVER EXPLORE注冊的數據庫。
添加northwind數據庫的具體步驟取決于,你是想通過(guò)App_Data文件夾中的SQL SERVER 2005 EXdivSS EDITION,還是想用SQL SERVER 2000或SQL SERVER 2005的數據庫。
1.1使用App_Data中的數據庫
如果您沒(méi)有SQL SERVER 2000或2005的數據庫服務(wù)器,或者說(shuō)您不想往數據庫服務(wù)器中添加數據庫,您可以用SQL SERVER 2005 EXdivSS EDITION版的northwind數據庫,您可以通過(guò)下載本項目的源代碼,然后在A(yíng)pp_Data中找到它(NorthWND.MDF).
位于A(yíng)pp_Data文件夾下的數據庫會(huì )自動(dòng)添加到SERVER EXPLORE中,加入您的機器已經(jīng)安裝了SQL SERVER 2005 EXdivSS EDITION,您會(huì )在SERVER EXPLORE中看到一個(gè)northwnd.mdf的節點(diǎn)。您可以展開(kāi)并查看其中的表、視圖、存儲過(guò)程等。
在A(yíng)pp_Data文件夾中,您同樣可以放置MICROSOFT ACCESS的.mdb文件,它同樣也會(huì )被自動(dòng)添加到SERVER EXPLORE中,如果您不想使用任何的SQL SERVER版本,可以下載一個(gè)MICROSOFT ACCESS版本的數據庫,并把它放在A(yíng)pp_Data中。但是注意:ACCESS數據庫相對于SQL SERVER沒(méi)有豐富的特性,而且其不是專(zhuān)為Web站點(diǎn)的開(kāi)發(fā)設計的,另外,后續的至少35篇文章中使用的特性可能ACCESS會(huì )不支持。
1.2  創(chuàng )建到SQL SERVER 2000或2005的數據庫連接
作為另一種方案,您也可以連接已經(jīng)安裝在數據庫服務(wù)器中的northwind數據庫,前提是數據庫已經(jīng)安裝到服務(wù)器了。如果沒(méi)有,您可以通過(guò)下載本示例教程中的安裝腳本或者從微軟的網(wǎng)站下載SQL SERVER 2000版的northwind和安裝腳本。
如果您已經(jīng)安裝了northwind,打開(kāi)VS中的SERVER EXPLORE,右擊“Data Connections”節點(diǎn),選擇“添加連接”。如果您沒(méi)有打開(kāi)SERVER EXPLORE,可以通過(guò)“視圖/服務(wù)器管理器”或按“ALT+CTRL+S”快捷鍵打開(kāi)。打開(kāi)“添加連接”對話(huà)框后,指定要連接的目標服務(wù)器,授權信息和數據庫,如果您已經(jīng)成功配置了數據庫連接信息,單擊“確定”按鈕,數據庫就會(huì )作為“Data Connections”節點(diǎn)下一個(gè)新節點(diǎn)添加到SERVER EXPLORE,您同樣可以展開(kāi),并查看其中的表、視圖、存儲過(guò)程等。
圖2    添加連接
第2步:創(chuàng )建DAL
處理數據的一個(gè)選擇是將處理的詳細邏輯直接放在顯示層(在Web應用程序中,ASP.NET頁(yè)面組成了顯示層),這種形式,通過(guò)將ADO.NET寫(xiě)到ASP.NET頁(yè)面下的編碼區域或者使用SQLDATASOURCE控件。這種途徑將DAL和顯示層緊密的耦合在一起。推薦的一種途徑是將DAL從顯示層分離出來(lái)。這個(gè)分離出來(lái)的層被叫做數據訪(fǎng)問(wèn)層,往往使用一個(gè)單獨的類(lèi)庫項目來(lái)實(shí)現。這種架構的優(yōu)點(diǎn)有很多,而且有許多說(shuō)明文檔。
所有數據底層數據源的代碼(如創(chuàng )建連接,進(jìn)行SELECT,INSERT,UPDATE,DELETE操作)都被放到DAL中,在顯示層不能包括任何數據訪(fǎng)問(wèn)的代碼,可以通過(guò)調用DAL來(lái)訪(fǎng)問(wèn)和請求數據。
DAL封裝了訪(fǎng)問(wèn)底層數據的典型方法,例如:northwind數據庫中有Products和Categories兩張表,分別記錄了銷(xiāo)售的商品和這些商品的類(lèi)型。在我們的DAL中,可能要創(chuàng )建如下方法:
GetCategories();返回所有類(lèi)型的信息。
GetProducts();返回所有商品的信息。
GetProductByCategoryID(CategoryID);返回特定類(lèi)型的商品。
GetProductByProductID(productid);返回某個(gè)商品的信息。
這些方法執行時(shí),會(huì )連接數據庫,實(shí)施查詢(xún),返回結果。如何返回這些結果是至關(guān)重要的。上述方法可以簡(jiǎn)單的返回一個(gè)dataset或datareader,但更完美的一種方式是:返回結果作為強類(lèi)型對象返回。所謂強類(lèi)型對象就是在編譯時(shí)就對其架構進(jìn)行了嚴格的定義,弱類(lèi)型恰恰想法,只能在運行時(shí),才被定義。
例如DataReader和默認的DataSet都是弱類(lèi)型,只能靠數據查詢(xún)返回的列來(lái)定義其架構。訪(fǎng)問(wèn)一個(gè)弱類(lèi)型的DataTable某一列的方法如下:DataTable.Rows(index)["columnName"].展示了必須通過(guò)一個(gè)字符串或下標去訪(fǎng)問(wèn)表中的一列。一個(gè)強類(lèi)型的DataTable可以將表中的每一列實(shí)現為屬性,當然,訪(fǎng)問(wèn)方式也發(fā)生了變化:DataTable.Rows(index).columnName.
為了返回一個(gè)強類(lèi)型的對象,開(kāi)發(fā)者一是可以創(chuàng )建自定義的業(yè)務(wù)對象或者可以使用強類(lèi)型的數據集。對于自定義業(yè)務(wù)對象,開(kāi)發(fā)者往往通過(guò)定義一個(gè)類(lèi)來(lái)實(shí)現,其中類(lèi)的屬性與底層數據庫相應表中的列是一一對應的。
一個(gè)強類(lèi)型的DataSet是VS根據數據庫的架構自動(dòng)產(chǎn)生的。其里面的成員都是強類(lèi)型的。強類(lèi)型數據集中包含的類(lèi)有效地擴展了ADO.NET中的DataSet,DataTable,DataRow。除了強類(lèi)型的DataTable,強類(lèi)型DataSet中還包括TableAdapter,這些類(lèi)中包含了操作DataSet中的表和將表中的改變提交到后臺數據庫的一系列的方法。
我們在整個(gè)系列中將使用強類(lèi)型數據集。下圖展示了使用強類(lèi)型數據集的應用程序層與層之間通信的工作流。
圖3    工作流
2.1 創(chuàng )建強類(lèi)型數據集和TableAdapter
下面開(kāi)始創(chuàng )建DAL,首先添加一個(gè)強類(lèi)型的數據集到項目中。步驟:右擊項目節點(diǎn),選擇“添加新項”,選擇DataSet模板,改名為northwind.xsd。
圖4   添加強類(lèi)型數據集
然后,單擊“添加”,當提示是否將DataSet添加到App_Code文件夾時(shí),選擇“是”。這是,將出現強類(lèi)型數據集設計器,同時(shí)TableAdapter配置向導將會(huì )啟動(dòng),允許您添加第一個(gè)TableAdapter到DataSet。
強類(lèi)型數據集是一個(gè)強類(lèi)型數據的集合,由多個(gè)強類(lèi)型DataTable的實(shí)例構成,每個(gè)強類(lèi)型的DataTable由多個(gè)強類(lèi)型的DataRow實(shí)例構成。我們將會(huì )為在項目中用到的底層數據庫中的每個(gè)表創(chuàng )建一個(gè)相應的強類(lèi)型DataTable。
下面是為Products表創(chuàng )建一個(gè)DataSet中的強類(lèi)型表。
請牢記,強類(lèi)型DataTables不包括訪(fǎng)問(wèn)底層數據庫表的任何信息,為了獲取數據填充這個(gè)表,我們用一個(gè)TableAdapter類(lèi)來(lái)充當DAL,對Products表而言,TableAdapter類(lèi)將包含以下方法(GetProducts(),GetProductsByCategoryId(categoryid)等)。我們可以在顯示層調用這些方法,DataTable在層與層的數據傳遞過(guò)程中充當強類(lèi)型的對象。
TableAdapter配置向導首先讓您選擇要操作的數據庫,在下拉列表中展示了SERVER EXPLORE中的所有的數據庫,如果沒(méi)有數據庫,您可以單擊“新建連接”,添加。
選擇完數據庫后,單擊下一步,您要選擇是否保存連接到Web.config文件,如果保存連接字符串,那么就不用在TableAdapter類(lèi)中硬編碼了。這樣也就避免了一旦將來(lái)連接字符串發(fā)生改變帶來(lái)的不必要的麻煩。
如果選擇保存到配置文件中,會(huì )保存在相應的<connectionstring>節,您同時(shí)可以對連接字符串進(jìn)行加密,以提供其安全性。也可以通過(guò)IIS的圖形化管理工具中的asp.net2.0的屬性頁(yè)面來(lái)修改。(這在某種程度,對管理員是一件好事)。
下一步,我們開(kāi)始定義第一個(gè)強類(lèi)型DataTable的架構,而且定義第一個(gè)方法以供TableAdapter來(lái)操作強類(lèi)型DataSet。這兩個(gè)操作,可以通過(guò)創(chuàng )建一個(gè)查詢(xún),讓其返回DataTable相應的列來(lái)實(shí)現,而且是同步實(shí)現的。在向導的最后,我們要給查詢(xún)命名一個(gè)方法名。當所有的這些都完成后,就可以通過(guò)顯示層來(lái)調用方法了。這個(gè)方法將會(huì )執行定義的查詢(xún)形成一個(gè)DataTable。
在定義查詢(xún)之前,首先要知道TableAdapter怎樣執行查詢(xún),我們可以使用單純的SQL語(yǔ)句,也可以創(chuàng )建一個(gè)新的存儲過(guò)程,或者使用一個(gè)現有的存儲過(guò)程。在我們的這個(gè)系列中,將使用單純的SQL語(yǔ)句。
那么我們就可以手工輸入SQL語(yǔ)句了,通過(guò)創(chuàng )建第一個(gè)方法,讓查詢(xún)返回相應表中的列,下圖展示了創(chuàng )建一個(gè)查詢(xún)返回Products表中所有的行和列。
當然,也可以使用查詢(xún)生成器,可視化創(chuàng )建查詢(xún)。
創(chuàng )建完查詢(xún)后,在轉到下一頁(yè)面前,單擊“高級”按鈕,在WEB SITE項目中,“Generate Insert,update,and delete statement”是唯一的默認選中項;如果您的項目是類(lèi)庫或者是Windows項目,“use optimistic concurrency”選項也是被選中的,現在請不要選擇這個(gè)復選框,對于這一話(huà)題,將在以后的文章中探討。
配置完高級選項后,單擊“下一步”到最后一個(gè)頁(yè)面,我們將選擇哪個(gè)方法添加到TableAdapter中,有兩種方式:
填充一個(gè)表:創(chuàng )建一個(gè)方法,以查詢(xún)結果生成的DataTable作為參數,并對其進(jìn)行處理。例如:ADO.NET TableAdapter類(lèi)調用Fill()方法。
返回一個(gè)表:方法用來(lái)創(chuàng )建、填充表,表作為方法的返回值。
您可以讓TableAdapter實(shí)現其中一個(gè)或兩個(gè)方法都實(shí)現,您也可以給方法改名。這里我們兩個(gè)選項全選,但后續的文章中將使用后一種方法。同時(shí)將通用的GetData方法名改為GetProducts()。
如果選中了最后一個(gè)checkbox,“GenerateDbDirectMethod”將會(huì )為T(mén)ableAdapter創(chuàng )建Insert,Update和Delete方法。
如果不選,所有的更新將通過(guò)TableAdapter唯一的方法Update來(lái)實(shí)施。而唯一的這個(gè)方法,對強類(lèi)型的Dataset,DataTable,DataRow或者行組都是通用的。
單擊“完成”完成向導,這時(shí)我們在設計器中得到一張表??梢钥吹奖碇械乃械牧?,(ProductId,ProductName等),同時(shí)還有ProductTableAdapter的所有方法(Fill方法和GetProducts方法)。
至此為止,我們創(chuàng )建了一個(gè)強類(lèi)型數據集和一個(gè)表,和一個(gè)強類(lèi)型的DataAdapter類(lèi)。這些對象可以用來(lái)訪(fǎng)問(wèn)商品列表,代碼如下:
NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
new NorthwindTableAdapters.ProductsTableAdapter();
Northwind.ProductsDataTable products;
products = productsAdapter.GetProducts();
foreach (Northwind.ProductsRow productRow in products)
Response.Write("Product: " + productRow.ProductName + "<br />");
我們不需要寫(xiě)任何代碼,也不需要實(shí)例化任何ADO.NET類(lèi),不需要去管連接字符串,SQL查詢(xún)和存儲過(guò)程。TableAdapter會(huì )為我們自動(dòng)生成這些底層的代碼。
本例中的每一個(gè)對象都是強類(lèi)型的,允許VS提供智能感知和編譯時(shí)的類(lèi)型判斷。大多數的TableAdapter返回的表都可以綁定到Web數據控件(GridView等)。下面的代碼演示了如何將GetProducts方法返回的結果綁定到一個(gè)GridView。
AllProducts.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AllProducts.aspx.cs"
Inherits="AllProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"
<html xmlns="
<head runat="server">
<title>View All Products in a GridView</title>
<link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>
All Products</h2>
<p>
<asp:GridView ID="GridView1" runat="server"
CssClass="DataWebControlStyle">
<HeaderStyle CssClass="HeaderStyle" />
<AlternatingRowStyle CssClass="AlternatingRowStyle" />
</asp:GridView>
</p>
</div>
</form>
</body>
</html>
AllProduct.aspx.cs:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindTableAdapters;
public partial class AllProducts : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ProductsTableAdapter productsAdapter = new
ProductsTableAdapter();
GridView1.DataSource = productsAdapter.GetProducts();
GridView1.DataBind();
}
}
這個(gè)例子演示了在Page_Load事件下寫(xiě)代碼,在以后的文章中,將演示如何使用ObjectDataSource從DAL中獲取數據,通過(guò)ObjectDataSource,可以不用寫(xiě)任何代碼,同時(shí)還能得到比較好的分頁(yè)和排序支持。
第3步:添加帶參數的方法到DAL
到此為止,類(lèi)ProductTableAdapter只有一個(gè)方法(GetProducts方法)用來(lái)返回所有商品信息。但有時(shí)候,我們可能只想知道某一個(gè)特殊商品的信息,或者某一類(lèi)型商品的信息,為了在DAL實(shí)現類(lèi)似的功能我們可以往TableAdapter中添加帶參數的方法。
下面我們添加GetProductsByCategoryId(categoryId)。步驟:選中設計器中的ProductTableAdapter區域,右擊,選擇“添加查詢(xún)”。
當提示用單純SQL語(yǔ)句或存儲過(guò)程時(shí),選擇SQL語(yǔ)句,接下來(lái)選擇應用何種SQL查詢(xún),由于我們想返回某一類(lèi)型的商品,所以選擇Select語(yǔ)句。
再下一步是定義訪(fǎng)問(wèn)數據庫的SQL查詢(xún)語(yǔ)句,由于想返回某一個(gè)類(lèi)型的商品信息,所以用與GetProducts方法相同的Select語(yǔ)句,然后在后面加上Where子句:Where
Categoryid=@Categoryid.@categoryid告訴TableAdapter,要創(chuàng )建的方法需要一個(gè)相應類(lèi)型的輸入參數。
最后選擇訪(fǎng)問(wèn)數據的方式和新創(chuàng )建的方法的方法名,分別用Fill方式命名FillByCategoryId;為Return a DataTable方式命名為GetProductsByCategoryId。
完成向導,發(fā)現設計器中包含了新的方法。
用同樣的方法添加GetProductsByProductId(productId)方法。
這些參數化查詢(xún)可以直接再DataSet設計器測試,右擊方法,選擇“預覽數據”,然后輸入參數值,單擊“預覽”
使用DAL中的GetProductsByCategoryId(categoryId)方法,借助于一個(gè)asp.net頁(yè)面,來(lái)展示特定類(lèi)型的商品,下面的代碼展示了類(lèi)型為“Beverages”的所有商品。
Beverages.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Beverages.aspx.cs"
Inherits="Beverages" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"
<html xmlns="
<head runat="server">
<title>Untitled Page</title>
<link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>Beverages</h2>
<p>
<asp:GridView ID="GridView1" runat="server"
CssClass="DataWebControlStyle">
<HeaderStyle CssClass="HeaderStyle" />
<AlternatingRowStyle CssClass="AlternatingRowStyle" />
</asp:GridView>
</p>
</div>
</form>
</body>
</html>
Beverages.aspx.cs:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindTableAdapters;
public partial class Beverages : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ProductsTableAdapter productsAdapter = new
ProductsTableAdapter();
GridView1.DataSource =
productsAdapter.GetProductsByCategoryID(1);
GridView1.DataBind();
}
}
第4步:插入、更新、刪除數據
通常,有兩種方式可以用來(lái)插入、更新和刪除數據。第一種可以成為“數據庫直接方式”。它涉及到創(chuàng )建多個(gè)執行插入、更新、刪除單一數據記錄的命令的方法。
這些方法通過(guò)傳遞一系列的值去完成相應的操作。例如,用這種方式,如果刪除Products表中一條記錄,需要Delete方法中有一個(gè)productId參數,而且參數的類(lèi)型為整數。
另外一種方式可以叫做“批量更新方式”(batch update pattern)。通過(guò)調用一個(gè)方法,來(lái)更新整個(gè)數據集,數據表或行集。用這種方式,開(kāi)發(fā)者對表中的記錄行做了一些操作后,把所有的數據行和表傳到Update方法中,該方法枚舉傳入的所有行,判斷它們是否發(fā)生了改變,以此為據完成相應的數據庫操作(Delete,Update,Insert)。
TableAdapter默認使用批量更新方式。但也支持數據庫直接方式。以前創(chuàng )建TableAdapter時(shí)選中“高級”里面的“Generate Insert,Update and Delete Statement”選項。ProductTableAdapter類(lèi)中Update方法就實(shí)現了批量更新。
如果您剛創(chuàng )建TableAdapter時(shí),選中了“GenerateDBDirectMethod”那么就通過(guò)Insert,Update,Delete方法實(shí)現了數據庫直接方式。
兩種方式,都要使用TableAdapter的InsertCommand,UpdateCommand,DeleteCommand屬性去執行Insert,Update,Delete命令。您可以檢查,修改這些屬性。通過(guò)打開(kāi)設計器中的TableAdapter的屬性窗口。
在檢查或修改任何屬性時(shí),當單擊“CommandText”屬性時(shí),將會(huì )打開(kāi)“查詢(xún)生成器”。
下面的代碼演示了如何使用批量更新模式來(lái)改變不打折商品和庫存不少于25的商品的價(jià)格(價(jià)格翻倍)。
NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
new NorthwindTableAdapters.ProductsTableAdapter();
// For each product, double its price if it is not discontinued and
// there are 25 items in stock or less
Northwind.ProductsDataTable products = productsAdapter.GetProducts();
foreach (Northwind.ProductsRow product in products)
if (!product.Discontinued && product.UnitsInStock <= 25)
product.UnitPrice *= 2;
// Update the products
productsAdapter.Update(products);
下面的代碼演示了如何使用數據庫直接模式刪除一個(gè)商品,更新和新增一個(gè)商品。
NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
new NorthwindTableAdapters.ProductsTableAdapter();
// Delete the product with ProductID 3
productsAdapter.Delete(3);
// Update Chai (ProductID of 1), setting the UnitsOnOrder to 15
productsAdapter.Update("Chai", 1, 1, "10 boxes x 20 bags",
18.0m, 39, 15, 10, false, 1);
// Add a new product
productsAdapter.Insert("New Product", 1, 1,
"12 tins per carton", 14.95m, 15, 0, 10, false);
4.1創(chuàng )建自定義的插入、刪除和更新方法
用“數據庫直接方式”產(chǎn)生的Insert,Update,Delete方法使用起來(lái)有點(diǎn)不靈活,特別是表中有許多字段時(shí),象剛才的代碼,如果沒(méi)有智能提示,那么Insert和Update方法的參數就會(huì )是一個(gè)很繁重的工作量,特別是只更新這些列中的某一列時(shí),有很多信息就重復輸入了。
可以創(chuàng )建自定義的方法解決上述問(wèn)題,右擊TableAdapter,選擇“添加查詢(xún)”,打開(kāi)TableAdapter向導,在查詢(xún)創(chuàng )建頁(yè)面,創(chuàng )建一個(gè)方法,用來(lái)添加一個(gè)新商品,并且返回新添加商品的ProductId,因此應該選擇Insert。
在下一個(gè)頁(yè)面,呈現出插入命令的代碼,然后通過(guò)在最后添加Select  Scope_IDENTITY()擴展這個(gè)命令。這個(gè)方法將返回最后一個(gè)添加到表中IDENTITY列的值。
注意:要保證Insert語(yǔ)句和Select語(yǔ)句用“;”隔開(kāi)。
最后命名該方法為InsertProduct()
當再次回到設計器時(shí),您會(huì )發(fā)現ProductTableAdapter節中新加了一個(gè)方法:InsertProduct。如果新表中沒(méi)有提供對應表中列的一系列參數,很可能時(shí)您在Insert語(yǔ)句和Select語(yǔ)句之間忘加“;”了。
默認情況下,插入時(shí)不需要查詢(xún)的,只返回被影響的行數。然而,如果我們想得到插入的值,而不是影響的行數的話(huà),可以修改InsertProduct方法的ExcuteMode屬性為:Scalar。
下面的代碼演示了InsertProduct方法的使用。
NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
new NorthwindTableAdapters.ProductsTableAdapter();
// Add a new product
int new_productID = Convert.ToInt32(productsAdapter.InsertProduct
("New Product", 1, 1, "12 tins per carton", 14.95m, 10, 0, 10, false));
// On second thought, delete the product
productsAdapter.Delete(new_productID);
第5步:完成DAL
注意到ProductTableAdapter類(lèi)通過(guò)Products表返回了CategoryId和SupplierId。但沒(méi)有CategroyName(在Categories表中)和SupplierName(在supplier表中)。但從道理上講,展示商品信息時(shí)是應該顯示這些信息的。接下來(lái),我們就來(lái)擴展最開(kāi)始創(chuàng )建的方法,GerProducts(),也就是改變DataTable的結構使其包含這些列。
這樣可能會(huì )引發(fā)一個(gè)問(wèn)題,就是TableAdapter中的Insert,Update,Delete方法都是基于這個(gè)方法的(會(huì )不會(huì )受影響)。慶幸的是,這些方法不會(huì )受到Select子查詢(xún)的影響。我們可以小心翼翼地將從Categories和Supplier的查詢(xún)作為子查詢(xún),而不是使用joins。使用上述方法,我們就可以避免重寫(xiě)方法,右擊“GetProducts()”,選擇“配置”,調整Select語(yǔ)句如下所示:
SELECT     ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued,
(SELECT CategoryName FROM Categories
WHERE Categories.CategoryID = Products.CategoryID) as CategoryName,
(SELECT CompanyName FROM Suppliers
WHERE Suppliers.SupplierID = Products.SupplierID) as SupplierName
FROM         Products
當更新完GetProducts()之后,再做查詢(xún)就包含CategoryName和SupplierName了。
用同樣的方法,更新GetProductByCategroyId方法的Select語(yǔ)句。
如果您用joins語(yǔ)法更新了GetProducts()方法,在“數據庫直接模式”下,設計器不會(huì )自動(dòng)產(chǎn)生Inserting,Updating,Deleting方法,您必須象創(chuàng )建InsertProduct方法那樣,手動(dòng)創(chuàng )建這些方法。另外,如果您想用“批量更新模式”,您必須手動(dòng)更新InsertCommand,UpdateCommand,DeleteCommand屬性的值。
5.1添加現有的TableAdapter
直到現在,我們一直在討論一個(gè)TableAdapter訪(fǎng)問(wèn)一個(gè)數據表,然而,Northwind數據庫包含了在Web應用程序中使用的很多相關(guān)聯(lián)的表,一個(gè)強類(lèi)型的DataSet可以包括很多相關(guān)聯(lián)的表,因此,為了完成DAL,我們必須添加在另外一些章節使用的一些表。
您可以通過(guò)打開(kāi)設計器,右擊,選擇“添加/TableAdapter”,就可以添加一個(gè)新表和一個(gè)新的TableAdapter了。
花一些時(shí)間完成下面的TableAdapter和方法,注意:如果您一直跟著(zhù)整個(gè)文章下來(lái),您已經(jīng)完成了GerProducts()和GetProductByCategoryId(categoryId)方法了。
ProductsTableAdapter
GetProducts:
SELECT ProductID, ProductName, SupplierID,
CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock,
UnitsOnOrder, ReorderLevel, Discontinued ,
(SELECT CategoryName FROM Categories WHERE
Categories.CategoryID = Products.CategoryID) as
CategoryName, (SELECT CompanyName FROM Suppliers
WHERE Suppliers.SupplierID = Products.SupplierID)
as SupplierName
FROM Products
GetProductsByCategoryID:
SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued , (SELECT CategoryName
FROM Categories WHERE Categories.CategoryID =
Products.CategoryID) as CategoryName,
(SELECT CompanyName FROM Suppliers WHERE
Suppliers.SupplierID = Products.SupplierID)
as SupplierName
FROM Products
WHERE CategoryID = @CategoryID
GetProductsBySupplierID:
SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued , (SELECT CategoryName
FROM Categories WHERE Categories.CategoryID =
Products.CategoryID) as CategoryName,
(SELECT CompanyName FROM Suppliers WHERE
Suppliers.SupplierID = Products.SupplierID) as SupplierName
FROM Products
WHERE SupplierID = @SupplierID
GetProductByProductID:
SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued , (SELECT CategoryName
FROM Categories WHERE Categories.CategoryID =
Products.CategoryID) as CategoryName,
(SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID = Products.SupplierID)
as SupplierName
FROM Products
WHERE ProductID = @ProductID
CategoriesTableAdapter
GetCategories:
SELECT CategoryID, CategoryName, Description
FROM Categories
GetCategoryByCategoryID:
SELECT CategoryID, CategoryName, Description
FROM Categories
WHERE CategoryID = @CategoryID
SuppliersTableAdapter
GetSuppliers:
SELECT SupplierID, CompanyName, Address,
City, Country, Phone
FROM Suppliers
GetSuppliersByCountry:
SELECT SupplierID, CompanyName, Address,
City, Country, Phone
FROM Suppliers
WHERE Country = @Country
GetSupplierBySupplierID:
SELECT SupplierID, CompanyName, Address,
City, Country, Phone
FROM Suppliers
WHERE SupplierID = @SupplierID
EmployeesTableAdapter
GetEmployees:
SELECT EmployeeID, LastName, FirstName, Title,
HireDate, ReportsTo, Country
FROM Employees
GetEmployeesByManager:
SELECT EmployeeID, LastName, FirstName, Title,
HireDate, ReportsTo, Country
FROM Employees
WHERE ReportsTo = @ManagerID
GetEmployeeByEmployeeID:
SELECT EmployeeID, LastName, FirstName, Title,
HireDate, ReportsTo, Country
FROM Employees
WHERE EmployeeID = @EmployeeID
5.2向DAL中添加自定義代碼
加入強類(lèi)型的DataSet中的TableAdapter和DataTables表示為XML Schema的形式,您可以通過(guò)右擊“設計器”,選擇“查看代碼”,來(lái)查看XML文件。
這些架構信息在編譯或執行時(shí),被轉換為C#代碼,您可以通過(guò)單步調試來(lái)查看??梢酝ㄟ^(guò)“類(lèi)視圖”來(lái)查看自動(dòng)生成的代碼,如果類(lèi)視圖沒(méi)有打開(kāi),可以通過(guò)“視圖/類(lèi)視圖”菜單或按“CTLR+SHIFT+C"快捷鍵打開(kāi)。
通過(guò)類(lèi)視圖,可以查看強類(lèi)型DataSet和TableAdapter類(lèi)的屬性,方法和事件??梢酝ㄟ^(guò)雙擊某個(gè)方法查看某個(gè)特定方法的實(shí)現代碼,或者在方法上右擊,選擇“定義”。
雖然自動(dòng)產(chǎn)生代碼可以節省大量的時(shí)間,但往往很單調,需要適當的修改才能完成一些特定的功能需求。擴展自動(dòng)產(chǎn)生的代碼的風(fēng)險是:有時(shí)工具會(huì )重新產(chǎn)生代碼,因而覆蓋您自定義的代碼。但通過(guò).net2.0 partial類(lèi)的概念,可以很容易將一個(gè)類(lèi)寫(xiě)成多個(gè)文件,就使得我們可以很方便添加屬性,方法和事件,而不用擔心被覆蓋或重寫(xiě)。
為了展示如何自定義DAL,我們添加一個(gè)GetProducts()方法到SupplierRow類(lèi)。該類(lèi)表示Supplier表中的一行。每個(gè)提供商可能提供零個(gè)或多個(gè)商品,所以GetProducts()用來(lái)放回某個(gè)提供商的商品,首先在A(yíng)pp_Code文件夾中創(chuàng )建一個(gè)新類(lèi),然后添加如下代碼:
using System;
using System.Data;
using NorthwindTableAdapters;
public partial class Northwind
{
public partial class SuppliersRow
{
public Northwind.ProductsDataTable GetProducts()
{
ProductsTableAdapter productsAdapter =
new ProductsTableAdapter();
return
productsAdapter.GetProductsBySupplierID(this.SupplierID);
}
}
}
partial關(guān)鍵字告訴編譯器:在生成SupplierRow類(lèi)時(shí),將包含GetProducts方法,等生成后,同樣可以在“類(lèi)視圖”中找到它。
GetProducts()方法可以枚舉某個(gè)提供商提供的商品,代碼如下:
NorthwindTableAdapters.SuppliersTableAdapter suppliersAdapter =
new NorthwindTableAdapters.SuppliersTableAdapter();
// Get all of the suppliers
Northwind.SuppliersDataTable suppliers =
suppliersAdapter.GetSuppliers();
// Enumerate the suppliers
foreach (Northwind.SuppliersRow supplier in suppliers)
{
Response.Write("Supplier: " + supplier.CompanyName);
Response.Write("<ul>");
// List the products for this supplier
Northwind.ProductsDataTable products = supplier.GetProducts();
foreach (Northwind.ProductsRow product in products)
Response.Write("<li>" + product.ProductName + "</li>");
Response.Write("</ul><p> </p>");
}
這些數據可以顯示在任何Web數據控件中,下面的頁(yè)面通過(guò)創(chuàng )建一個(gè)包含兩列的GridView來(lái)顯示數據。
一個(gè)綁定列,用于顯示提供商。
一個(gè)模板列,包含一個(gè)BulletedList控件,用于綁定GetProducts()方法的結果。
下面的代碼,展示了SupplierRow類(lèi)中自定義方法的應用:
SuppliersAndProducts.aspx:
<%@ Page Language="C#" CodeFile="SuppliersAndProducts.aspx.cs"
AutoEventWireup="true" Inherits="SuppliersAndProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"
<html xmlns="<head runat="server">
<title>Untitled Page</title>
<link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>
Suppliers and Their Products</h2>
<p>
<asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="False"
CssClass="DataWebControlStyle">
<HeaderStyle CssClass="HeaderStyle" />
<AlternatingRowStyle CssClass="AlternatingRowStyle" />
<Columns>
<asp:BoundField DataField="CompanyName"
HeaderText="Supplier" />
<asp:TemplateField HeaderText="Products">
<ItemTemplate>
<asp:BulletedList ID="BulletedList1"
runat="server" DataSource="<%#
((Northwind.SuppliersRow)((System.Data.DataRowView)
Container.DataItem).Row).GetProducts() %>"
DataTextField="ProductName">
</asp:BulletedList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</p>
</div>
</form>
</body>
</html>
SuppliersAndProducts.aspx.cs:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindTableAdapters;
public partial class SuppliersAndProducts : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
SuppliersTableAdapter suppliersAdapter = new
SuppliersTableAdapter();
GridView1.DataSource = suppliersAdapter.GetSuppliers();
GridView1.DataBind();
}
}
二、總結
在創(chuàng )建Web應用程序時(shí),創(chuàng )建DAL是第一步,一定要在創(chuàng )建顯示層之前創(chuàng )建。通過(guò)VS創(chuàng )建一個(gè)基于強類(lèi)型DataSet的DAL,大概10-15分鐘就完成了(如果不寫(xiě)任何代碼的話(huà))。接下來(lái)的整個(gè)系列都要依賴(lài)于該DAL。在下一篇中,我們將定義一些業(yè)務(wù)規則,而且學(xué)習如何在一個(gè)單獨的業(yè)務(wù)邏輯層中實(shí)現它們。
快樂(lè )編程?。?!
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Scott Mitchell 的ASP.NET 2.0數據教程之一: 創(chuàng )建一個(gè)數據訪(fǎng)問(wèn)層
創(chuàng )建數據訪(fǎng)問(wèn)層VB
.net開(kāi)發(fā)中批量刪除記錄時(shí)實(shí)現全選功能的具體方法
C#
ASP.NET2.0數據操作之創(chuàng )建業(yè)務(wù)邏輯層
用ASP.NET/C#連接Access和SQL Server數據庫
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久