ASP.NET网站制作之ASP.NET2.0数据操纵之创立数据会见层(4...
你可以先看看这篇文章(软微学院生涯-三朝元老经验谈),打不开再跟我说。(我的意思是想让她自己先稍微了解一下到底现在各个方向学的工具以及以后要做的工具大概是什么,因为喜欢做什么样的事其实自己最清楚的)asp.net|创立|会见|数据 第五步:完成数据会见层注重,ProductsTableAdapters类从Products表中前往的是CategoryID和SupplierID的值,但其实不包含Categories表的CategoryName字段和Suppliers表的CompanyName字段,只管当我们显现产物信息时,这些极可能是我们想要显现的字段。我们能够扩大TableAdapter的肇端方法GetProducts()来包括CategoryName和CompanyName字段的值,这办法进而会更新强范例的DataTable来包含这些新的字段。
但这会形成一个成绩,由于TableAdapter的拔出,更新,删除数据的办法是基于这个肇端办法的,侥幸的是,主动天生的拔出,更新,删除办法其实不会受SELECT子句中的子查询的影响。假如我们注重把对Categories和Suppliers的查询增加成子查询,而不是用JOIN语句的话,我们能够制止重做这些修正数据的办法。在ProductsTableAdapter中的GetProducts()办法上按右鼠标,选择“设置”,然后,把SELECT子句改成:
SQL1234567SELECTProductID,ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,Discontinued,(SELECTCategoryNameFROMCategoriesWHERECategories.CategoryID=Products.CategoryID)asCategoryName,(SELECTCompanyNameFROMSuppliersWHERESuppliers.SupplierID=Products.SupplierID)asSupplierNameFROMProducts
9:更新GetProducts()办法的SELECT语句
在更新GetProducts()办法利用这个新查询语句以后,对应的DataTable将包括2个新字段,CategoryName和SupplierName。
0:ProductsDataTable多了2个新字段
花点工夫把GetProductsByCategoryID(categoryID)办法中的SELECT子句也更新一下。
假如你利用JOIN句法更新GetProducts()中的SELECT语句的话,DataSet计划器不克不及利用DB间接形式主动天生拔出,更新,和删除数据库纪录的办法。你必需手工天生这些办法,就象本教程新近时分我们对InsertProduct办法的做法一样。别的,你必需手工供应InsertCommand,UpdateCommand和DeleteCommand属性值,假设你想利用批更新形式的话。
增加其他的TableAdapter
到今朝为止,我们只会商了针对单个数据表的单个TableAdapter。可是,Northwind数据库里含有我们必要在我们的web使用中利用的几个相干的表。一个强范例的DataSet能够包括多个相干的DataTable。因而,为了完成我们的DAL,我们必要为这些我们未来要用到的数据表增加响应的DataTable。步骤以下,翻开DataSet计划器,在计划器上按右鼠标,选择“增加/TableAdapter”。这会天生一个新的DataTable和TableAdapter,然后我们新近会商过的设置导游会指引你完成设置。
花上几分钟,创立对应于以下查询的TableAdapter及其办法。注重,ProductsTableAdapter的查询中包括了用以猎取每一个产物的分类和供给商名字的子查询。别的,假如你是跟着教程在做的话,你已增加过ProductsTableAdapter类的GetProducts()和GetProductsByCategoryID(categoryID)办法了。
[*]ProductsTableAdapter
[*]GetProducts:
SELECTProductID,ProductName,SupplierID,CategoryID,
QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,
ReorderLevel,Discontinued,(SELECTCategoryNameFROM
CategoriesWHERECategories.CategoryID=
Products.ProductID)asCategoryName,(SELECTCompanyName
FROMSuppliersWHERESuppliers.SupplierID=
Products.SupplierID)asSupplierName
FROMProducts
[*]GetProductsByCategoryID:
SELECTProductID,ProductName,SupplierID,CategoryID,
QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,
ReorderLevel,Discontinued,(SELECTCategoryNameFROM
CategoriesWHERECategories.CategoryID=
Products.ProductID)asCategoryName,
(SELECTCompanyNameFROMSuppliersWHERE
Suppliers.SupplierID=Products.SupplierID)asSupplierName
FROMProducts
WHERECategoryID=@CategoryID
[*]GetProductsBySupplierID
SELECTProductID,ProductName,SupplierID,CategoryID,
QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,
ReorderLevel,Discontinued,
(SELECTCategoryNameFROMCategoriesWHERE
Categories.CategoryID=Products.ProductID)
asCategoryName,(SELECTCompanyNameFROMSuppliers
WHERESuppliers.SupplierID=Products.SupplierID)
asSupplierName
FROMProducts
WHERESupplierID=@SupplierID
[*]GetProductByProductID
SELECTProductID,ProductName,SupplierID,CategoryID,
QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,
ReorderLevel,Discontinued,(SELECTCategoryName
FROMCategoriesWHERECategories.CategoryID=
Products.ProductID)asCategoryName,
(SELECTCompanyNameFROMSuppliers
WHERESuppliers.SupplierID=Products.SupplierID)
asSupplierName
FROMProducts
WHEREProductID=@ProductID
[*]CategoriesTableAdapter
[*]GetCategories
SELECTCategoryID,CategoryName,Description
FROMCategories
[*]GetCategoryByCategoryID
SELECTCategoryID,CategoryName,Description
FROMCategories
WHERECategoryID=@CategoryID
[*]SuppliersTableAdapter
[*]GetSuppliers
SELECTSupplierID,CompanyName,Address,City,
Country,Phone
FROMSuppliers
[*]GetSuppliersByCountry
SELECTSupplierID,CompanyName,Address,
City,Country,Phone
FROMSuppliers
WHERECountry=@Country
[*]GetSupplierBySupplierID
SELECTSupplierID,CompanyName,Address,
City,Country,Phone
FROMSuppliers
WHERESupplierID=@SupplierID
[*]EmployeesTableAdapter
[*]GetEmployees
SELECTEmployeeID,LastName,FirstName,
Title,HireDate,ReportsTo,Country
FROMEmployees
[*]GetEmployeesByManager
SELECTEmployeeID,LastName,FirstName,
Title,HireDate,ReportsTo,Country
FROMEmployees
WHEREReportsTo=@ManagerID
[*]GetEmployeeByEmployeeID
SELECTployeeID,LastName,FirstName,
Title,HireDate,ReportsTo,Country
FROMEmployees
WHEREEmployeeID=@EmployeeID
1:增加了四个TableAdapter后的DataSet计划器
给DAL增加定制编码
增加到强范例DataSet中的TableAdapter和DataTable是在一个XMLSchema界说文件(Northwind.xsd)中界说的。你能够在办理计划资本办理器里在Northwind.xsd文件上按右鼠标,选择“检察编码(ViewCode)”,翻开这个Schema文件来检察个中内容。
2:Northwinds强范例DataSet的XMLSchema界说文件
这个schema信息在计划时编译以后会被翻译成C#或VisualBasic编码,大概假如有需要的话,会在运转时翻译,然后你就可以在调试器里单步遍历实行。想检察这些主动天生的编码的话,在类视图里,展开TableAdapter类大概强范例的DataSet类。假如在屏幕上看不到类视图的话,在“检察”(View)菜单里选择“类视图”,大概按键组合Ctrl+Shift+C。在类视图里,你能看到强范例的DataSet类和TableAdapter类的属性,办法和事务。想看某个特定的办法的编码话,在类视图双击对应办法的名字大概在办法上按右鼠标,选择“移至界说区(GoToDefinition)”。
3:在类视图里选择“移至界说区(GoToDefinition)”,检察主动天生的编码
固然主动天生的编码省时省力,但如许的编码常常长短常通用化的(generic),为满意一个使用程序独有的需求必要做些定制。但扩大主动天生的编码的风险在于,假如天生这些编码的工具决意该是从头天生这些编码的时分了,则会把你定制的编码冲失落。利用.NET2.0中的一个新的部分(partial)类的观点,很简单将一个类的界说分写在几个文件里。这同意我们给主动天生的类增加我们本人的办法,属性,和事务,而不必忧虑VisualStudio会冲失落我们的定制编码。
为树模怎样定制DAL起见,让我们来给SuppliersRow增加一个GetProducts()办法。这个SuppliersRow类代表了Suppliers表的一般纪录,每一个供给商(supplier)能够供应0个到多个产物,以是GetProducts()将前往指定的供给商的这些产物。做法如下,在App_Code文件夹里增加一个新的类文件,将其定名为SuppliersRow.cs,然后在个中增加以下编码:
C#1234567891011121314151617usingSystem;usingSystem.Data;usingNorthwindTableAdapters;publicpartialclassNorthwind{publicpartialclassSuppliersRow{publicNorthwind.ProductsDataTableGetProducts(){ProductsTableAdapterproductsAdapter=newProductsTableAdapter();returnproductsAdapter.GetProductsBySupplierID(this.SupplierID);}}}
这个部分(partial)类唆使编译器在编译Northwind.SuppliersRow类时,应当包括我们刚界说的这个GetProducts()办法。假如你编译你的项目,然后前往类视图,你就会看到GetProducts()已被列为Northwind.SuppliersRow的一个办法。
4:GetProducts()办法成为Northwind.SuppliersRow类的一部分
GetProducts()办法如今就可以用来列举一个指定供给商的产物列单,以下列编码所示:
C#12345678910111213141516171819NorthwindTableAdapters.SuppliersTableAdaptersuppliersAdapter=newNorthwindTableAdapters.SuppliersTableAdapter();//GetallofthesuppliersNorthwind.SuppliersDataTablesuppliers=suppliersAdapter.GetSuppliers();//Enumeratethesuppliersforeach(Northwind.SuppliersRowsupplierinsuppliers){Response.Write("Supplier:"+supplier.CompanyName);Response.Write("<ul>");//ListtheproductsforthissupplierNorthwind.ProductsDataTableproducts=supplier.GetProducts();foreach(Northwind.ProductsRowproductinproducts)Response.Write("<li>"+product.ProductName+"</li>");Response.Write("</ul><p></p>");}
ThisdatacanalsobedisplayedinanyofASP.NETsdataWebcontrols.ThefollowingpageusesaGridViewcontrolwithtwofields:数据也能够在任何一种ASP.NET的Web控件中显现。上面这个网页利用了含有2个字段的GridView控件:
[*]一个BoundField用以显现每一个供给商的名字,
[*]另外一个TemplateField,包括了一个BulletedList控件,用来绑定针对每一个供给商挪用的GetProducts()办法前往的了局
我们将在今后的教程里会商如何来显现如许的主/从(master-detail)报表。在这里,这个例子的目标是用来树模怎样利用增加到Northwind.SuppliersRow类中的自界说的办法的。
SuppliersAndProducts.aspx
ASP.NET1234567891011121314151617181920212223242526272829303132333435363738394041<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="SuppliersAndProducts.aspx.cs"Inherits="SuppliersAndProducts"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"><headrunat="server"><title>UntitledPage</title><linkhref="Styles.css"rel="stylesheet"type="text/css"/></head><body><formid="form1"runat="server"><div><h1>SuppliersandTheirProducts</h1><p><asp:GridViewID="GridView1"runat="server"AutoGenerateColumns="False"CssClass="DataWebControlStyle"><HeaderStyleCssClass="HeaderStyle"/><AlternatingRowStyleCssClass="AlternatingRowStyle"/><Columns><asp:BoundFieldDataField="CompanyName"HeaderText="Supplier"/><asp:TemplateFieldHeaderText="Products"><ItemTemplate><asp:BulletedListID="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
C#12345678910111213141516171819202122usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Collections;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.WebControls.WebParts;usingSystem.Web.UI.HtmlControls;usingNorthwindTableAdapters;publicpartialclassSuppliersAndProducts:System.Web.UI.Page{protectedvoidPage_Load(objectsender,EventArgse){SuppliersTableAdaptersuppliersAdapter=newSuppliersTableAdapter();GridView1.DataSource=suppliersAdapter.GetSuppliers();GridView1.DataBind();}}
5:供给商的公司名字列在左栏,他们的产物列在右栏
总结
机关web使用时,创立DAL应当是你开始做的步骤之一,应当在你入手下手创立体现层之行进行。利用VisualStudio的话,创立基于强范例DataSet的DAL是个能够不写一行编码,在10到15分钟内便可完成的义务。今后的教程将创建在这个DAL基本之上。鄙人一个教程里,我们将界说一堆营业划定规矩,然后看一下怎样在一个分隔的营业逻辑层里完成这些划定规矩。
以前很热炒跨平台,主要是由于硅谷挑战微软霸主地位的热情,但是冷静下来后,跨平台往往不是那么一回事。假设你有个软件,所谓的跨平台,你只需要为第二个平台上重新编译一次就行了,这样很难么? 由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。 ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。 JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。 虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。 主流网站开发语言之PHP:PHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。 HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了. 主流网站开发语言之JSP:JSP和Servlet要放在一起讲,是因为它们都是Sun公司的J2EE(Java2platformEnterpriseEdition)应用体系中的一部分。 碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。
页:
[1]