数据访问课件_第1页
数据访问课件_第2页
数据访问课件_第3页
数据访问课件_第4页
数据访问课件_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章数据访问1第7章数据访问1本章要点:掌握VisualStudio2008中管理数据库的方法熟练使用数据源控件掌握LINQ查询表达式熟练使用LINQtoSQL和LINQtoXML进行数据访问管理2本章要点:掌握VisualStudio2008中管理数据目录7.1数据访问概述7.2建立SQLServerExpress数据库7.3数据源控件7.3.1SqlDataSource控件7.3.2XmlDataSource控件7.3.3SiteMapDataSource控件7.3.4LinqDataSource控件3目录7.1数据访问概述3目录7.4使用LINQ实现数据访问7.4.1LINQ查询表达式7.4.2LINQtoSQL概述7.4.3LINQtoSQL查询数据7.4.4使用LINQtoSQL管理数据7.4.5LINQtoXML概述7.4.6使用LINQtoXML管理XML文档7.5小结4目录7.4使用LINQ实现数据访问47.1数据访问概述ASP.NET1.X主要使用ADO.NET访问数据。ADO.NET提供了用于完成如数据库连接、查询数据、插入数据、更新数据和删除数据等操作的对象。

Connection对象Command对象DataReader对象DataAdapter对象DataSet对象57.1数据访问概述ASP.NET1.X主要使用ADOADO.NET两种读取数据库的方式Connection、Command和DataReader对象:只能读取数据库。如果只是想查询记录的话,这种方式的效率更高些。Connection、Command、DataAdapter和DataSet对象:可以对数据库进行各种操作。

6ADO.NET两种读取数据库的方式Connection、CASP.NET2.0增加了多种数据源控件和数据绑定控件数据源控件封装所有获取和处理数据的功能,主要包括连接数据源、使用Select、Update、Delete和Insert等SQL语句获取和管理数据等。数据绑定控件主要用于以多种方式显示数据。结合使用数据源控件和数据绑定控件,只需要设置相关属性,几乎不用编写任何代码即能存取数据库。7ASP.NET2.0增加了多种数据源控件和数据绑定控件数ASP.NET3.5引入了一种新技术LINQ

填补了传统.NET语言和查询语句之间的空白,使得查询等数据访问操作完全与.NET语言整合,实现了通过.NET语言访问数据库的功能。未来数据访问的趋势。8ASP.NET3.5引入了一种新技术LINQ填补了传统.7.2建立SQLServerExpress数据库SQLServerExpress2005是SQLServer2005系列中的精简版,允许无偿获取并免费再分发,同时对系统配置的要求相对比较低,非常适合于中小型企业的开发应用。SQLServerExpress2005与ASP.NET3.5紧密集成。在安装VisualStudio2008时,与ASP.NET3.5一同安装。97.2建立SQLServerExpress数据库S7.2建立SQLServerExpress数据库(续)允许建立网站时直接在VisualStudio2008的开发环境中创建并管理数据库。在ASP.NET3.5的用户认证和个性化的服务中,会自动创建SQLServerExpress2005的数据库ASPNETDB.MDF,并能与网站配合,自动保存相关数据,从而简化了设计过程。107.2建立SQLServerExpress数据库(续7.2建立SQLServerExpress数据库(续)利用图形管理工具SSMSE管理SQLServerExpress数据库。利用VisualStudio2008中“服务器资源管理器”管理SQLServerExpress数据库。117.2建立SQLServerExpress数据库(续7.3数据源控件用于实现从不同数据源获取数据的功能。127.3数据源控件用于实现从不同数据源获取数据的功能。17.3数据源控件(续)提供了统一的基本编程模型。通过数据源控件中定义的各种事件,可以实现Select、Update、Delete和Insert等数据操作。提供了数据操作前后的事件。如:实现数据插入操作的Insert()方法。发生在数据插入之前的Inserting事件。发生在数据插入之后的Inserted事件。137.3数据源控件(续)提供了统一的基本编程模型。137.3.1SqlDataSource控件用来访问Access、SQLServer、SQLServerExpress、Oracle、ODBC数据源和OLEDB数据源。要访问带密码的Access数据库,就不能使用AccessDataSource,只能使用SqlDataSource控件。 <asp:SqlDataSourceID="SqlDataSource1"runat="server"></asp:SqlDataSource>147.3.1SqlDataSource控件用来访问AcceSqlDataSource常用属性表ConnectionString获取或设置连接到数据库的字符串。DataSourceMode获取或设置获取数据时所使用的数据返回模式。值DataReader表示获取只读数据;值为DataSet表示获取数据可更改。默认值为DataSet。DeleteCommand获取或设置用于删除数据的SQL语句或存储过程名。DeleteCommandType获取或设置属性DeleteCommand值的类型。Text表示SQL语句;StoreProcedure表示存储过程。默认值为Text。DeleteParameters获取DeleteCommand值中出现的参数集合。DeleteQuery设置Delete命令使用的参数。15SqlDataSource常用属性表ConnectionSSqlDataSource常用属性表(续)EnableCaching逻辑值,true表示启用数据缓存功能,false表示不启用。默认值为false。InsertCommand获取或设置用于插入数据的SQL语句或存储过程名。InsertCommandType获取或设置属性InsertCommand值的类型。InsertParameters获取属性InsertCommand值中出现的参数集合。InsertQuery设置Insert语句使用的参数。ProviderName获取或设置连接数据源的提供程序名称。16SqlDataSource常用属性表(续)EnableCacSqlDataSource常用属性表(续)SelectCommand获取或设置用于查询数据的SQL语句或存储过程名。SelectCommandType获取或设置属性SelectCommand值的类型。SelectParameters获取SelectCommand值中出现的参数集合。SelectQuery设置Select语句使用的参数。UpdateCommand获取或设置用于更新数据的SQL语句或存储过程。UpdateCommandType获取或设置UpdateCommand值的类型。UpdateParameters获取属性UpdateCommand值中出现的参数集合。UpdateQuery设置Update命令使用的参数。17SqlDataSource常用属性表(续)SelectCom连接数据库使用SqlDataSource连接数据源不需要编写代码,只需按“配置数据源”向导逐步设置就可以了。18连接数据库使用SqlDataSource连接数据源不需要编“配置数据源”向导19“配置数据源”向导19数据连接说明下拉列表框会列出存储在App_Data文件夹中的数据库名和存储在web.config文件的<connectionStrings>配置节中的数据连接名。连接字符串包括数据库信息和身份验证信息。

DataSource=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MyPetShop.mdf; IntegratedSecurity=True;UserInstance=True

20数据连接说明下拉列表框会列出存储在App_Data文件夹中的数据连接说明(续)SQLServer数据库的身份验证:Windows验证、SQLServer验证和混合验证。Windows验证使用Windows用户帐号连接SQLServer,常用于局域网络。21数据连接说明(续)SQLServer数据库的身份验证:Wi数据连接说明(续)SQLServer验证使用SQLServer的注册帐号连接SQLServer,常用于Internet环境。 DataSource=.\SQLEXPRESS; AttachDbFilename="E:\Book\MyPetShop.mdf"; PersistSecurityInfo=True; UserID=saa;Password=sdf@~1; ConnectTimeout=30;UserInstance=False混合验证的连接字符串可选择Windows验证格式或SQLServer验证格式。22数据连接说明(续)SQLServer验证使用SQLSer“配置数据源”向导(续)23“配置数据源”向导(续)23连接字符串存放位置说明在SqlDataSource控件的定义中<asp:SqlDataSourceID="SqlDataSource1"runat="server"

ConnectionString="DataSource=.\SQLEXPRESS;AttachDbFilename="E:\Book\MyPetShop.mdf"; PersistSecurityInfo=True; UserID=saa;Password=sdf@~1;ConnectTimeout=30; UserInstance=False"

ProviderName="System.Data.SqlClient"SelectCommand="SELECT*FROM[Category]"></asp:SqlDataSource>24连接字符串存放位置说明在SqlDataSource控件的定义连接字符串存放位置说明(续)在web.config的<connectionStrings>配置节中<connectionStrings><addname="MyPetShopConnectionString"connectionString="DataSource=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MyPetShop.mdf; IntegratedSecurity=True;UserInstance=True"providerName="System.Data.SqlClient"/></connectionStrings>25连接字符串存放位置说明(续)在web.config的<con连接字符串存放位置说明(续)SqlDataSource控件的定义<asp:SqlDataSourceID="SqlDataSource1"runat="server"

ConnectionString="<%$ConnectionStrings:MyPetShopConnectionString%>"

SelectCommand="SELECTDISTINCT[CategoryId]FROM[Product]"></asp:SqlDataSource>

26连接字符串存放位置说明(续)SqlDataSource控件的“配置数据源”向导(续)27“配置数据源”向导(续)27“配置数据源”向导(续)28“配置数据源”向导(续)28连接字符串加密处理利用命令行工具aspnet_regiis.exe为连接字符串加密。aspnet_regiis–pefconnectionStringsE:\website

利用命令行工具aspnet_regiis.exe为连接字符串解密。aspnet_regiis–pdfconnectionStringsE:\website

29连接字符串加密处理利用命令行工具aspnet_regiis连接失败连接数据库失败是程序开发中常有的情形。造成失败的原因有连接字符串设置错误、数据库服务未启动、网络问题等。此时,需要给用户适当的出错提示信息。30连接失败连接数据库失败是程序开发中常有的情形。造成失败的原实例7-1连接失败的处理当数据库连接正常时在下拉列表中填充“Category”表的“Name”字段信息。当数据库连接失败时返回出错信息。源程序:FailtureConn.aspx程序说明:当SqlDataSource控件执行Select命令之后,将触发Selected事件,并且抛出任何异常信息。因此,数据库连接失败的处理可在Selected事件中捕获异常,再显示出错信息并通知SqlDataSource控件已处理异常。31实例7-1连接失败的处理当数据库连接正常时在下拉列表中填SqlDataSource的参数绑定在Select、Insert、Delete、Update等数据操作时允许使用参数。32SqlDataSource的参数绑定在Select、InsSqlDataSource参数绑定的数据来源ControlParameter:实现控件属性值与参数的绑定。FormParameter:实现表单域的值与参数的绑定。CookieParameter:实现Cookie对象值与参数的绑定。ProfileParameter:实现用户配置属性值与参数的绑定。QueryStringParameter:实现QueryString对象值与参数的绑定。SessionParameter:实现Session对象与参数的绑定。

33SqlDataSource参数绑定的数据来源ControlP实例7-2实现SqlDataSource控件的参数绑定

当选择宠物类别后,列表框中将显示该类别的所有产品。源程序:SqlDSParameters.aspx程序说明:本示例不用编写任何代码,所有操作都通过属性设置实现。34实例7-2实现SqlDataSource控件的参数绑定利用SqlDataSource设置的SQL语句管理数据

在数据源配置时除可设定Select语句外,还可组合Insert、Update和Delete语句。设定的Select语句在网页有数据显示时即被执行,不需要调用相应的方法执行,而设定的Insert、Update和Delete语句必须调用相应的方法才能被执行。例如,Insert语句的执行应调用SqlDataSource控件的Insert()方法。35利用SqlDataSource设置的SQL语句管理数据在数实例7-3利用SqlDataSource插入数据当输入“分类名”、“描述”等信息,单击“插入并显示”后,将把数据信息插入到Category表,然后在GridView中显示表中所有数据。源程序:SqlDSInsert.aspx程序说明:单击按钮时将调用Insert()方法,从而执行SqlDataSource中设置的Insert语句,实现数据插入功能。然后再执行SqlDataSource中设置的Select语句,返回Category表中所有数据并在GridView中显示出来。36实例7-3利用SqlDataSource插入数据当输入“在SqlDataSource中使用存储过程使用存储过程,可以将数据库操作的各种SQL命令经过编译后直接存放到数据库端。各个应用程序只需利用简单的调用语句即可调用存储过程完成对数据库的各种操作。这样就大大提高了代码的重用度。37在SqlDataSource中使用存储过程使用存储过程,可实例7-4在VisualStudio2008中建立存储过程存储过程要求实现的功能是向Category表中插入记录和查询所有记录。操作流程:在“服务器资源管理器”窗口中展开相应的数据库,右击“存储过程”→“添加新存储过程”。源程序:CategoryInsert存储过程38实例7-4在VisualStudio2008中建立存实例7-5利用存储过程插入数据本实例实现的功能与实例7-3相同,区别是单击“插入并显示”按钮后将调用存储过程CategoryInsert向Category表插入记录,再将Category表中所有记录信息通过GridView呈现出来。源程序:SqlDSProcedure.aspx39实例7-5利用存储过程插入数据本实例实现的功能与实例7-7.3.2XmlDataSource控件访问的是“层次化数据”,常用于连接和访问XML数据源中的数据。属性DataFile:用于设置要绑定的XML文件名。对于能显示层次化数据的控件有TreeView、Menu等,只需设置这些控件的属性DataSourceID值,即能显示XMLDataSource中的XML数据。对GridView控件,需要利用.xsl文件将XML文件转化为“表格化数据”后才能正常显示。407.3.2XmlDataSource控件访问的是“层次实例7-6在GridView中显示XML文件源程序:books.xml源程序:books.xsl源程序:XmlDSGridView.aspx41实例7-6在GridView中显示XML文件源程序:b7.3.3SiteMapDataSource控件用于访问XML格式的网站地图文件Web.sitemap,再将数据源绑定到TreeView、SiteMapPath或Menu等控件即能显示网站地图文件内容。当与SiteMapPath控件绑定时,不需要声明SiteMapDataSource,系统会自动实现绑定。不需要设置连接数据源的属性。427.3.3SiteMapDataSource控件用于访7.3.4LinqDataSource控件利用LINQ访问数据库。在使用时,首先要建立数据源的上下文对象,该对象包含要查询的数据的基对象,实质是一个LINQtoSQL类文件。437.3.4LinqDataSource控件利用LINQ访实例7-7使用LinqDataSource和GridView显示表数据表Category的数据显示利用了LinqDataSource和GridView。源程序:LinqDSGridView.aspx44实例7-7使用LinqDataSource和GridVi7.4使用LINQ实现数据访问LINQ集成于.NETFramework3.5中,提供了统一的语法实现多种数据源的查询和管理。它与.NET支持的编程语言整合为一体,使得数据的查询和管理直接被嵌入在编程语言的代码中,这样,就能充分利用VisualStudio2008的智能提示功能,并且编译器也能检查查询表达式中的语法错误。457.4使用LINQ实现数据访问LINQ集成于.NET7.4使用LINQ实现数据访问(续)LINQtoObject:用于处理Array和List等集合类型数据;LINQtoSQL:用于处理SQLServer等关系数据库类型数据;LINQtoXML:用于处理XML类型数据;LINQtoDataSet:用于处理DataSet类型数据。467.4使用LINQ实现数据访问(续)LINQtoO7.4.1LINQ查询表达式实现了如何访问操作数据,常使用关键字为var的隐形变量存放返回数据。这种var变量可以不明确地指定数据类型,但编译器能根据变量的表达式推断出该变量的类型。477.4.1LINQ查询表达式实现了如何访问操作数据,常使LINQ查询基本子句from子句:指定查询操作的数据源和范围变量。select子句:指定查询结果的类型和表现形式。where子句:指定筛选元素的逻辑条件。group子句:对查询结果进行分组。orderby子句:对查询结果进行排序。join子句:连接多个查询操作的数据源。let子句:引入用于存储查询表达式中的子表达式结果的范围变量。into子句:提供一个临时标识符,该标识符可以在join、group或select子句中被引用。48LINQ查询基本子句from子句:指定查询操作的数据源和范LINQ查询基本子句(续)查询表达式必须以from子句开始,以select或group子句结束,中间可以包含一个或多个from、where、orderby、group、join、let等子句。49LINQ查询基本子句(续)497.4.2LINQtoSQL概述为关系数据库提供了一个对象模型,即将关系数据库映射为类对象。开发人员将以操作对象的方式实现对数据的查询、修改、插入和删除等操作。507.4.2LINQtoSQL概述为关系数据库提供了一DataContext是什么?作用DataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型,用于把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入数据库。功能以日志形式记录DataContext生成的SQL执行SQL(包括查询和更新语句)创建和删除数据库DataContext是实体和数据库之间的桥梁。51DataContext是什么?作用51数据库与对象间映射关系表SQLServer对象LINQtoSQL对象SQLServer数据库DataContext类表实体类属性属性外键关系关联存储过程方法52数据库与对象间映射关系表SQLServer对象LINQ7.4.2LINQtoSQL概述(续)要建立SQLServer数据库与LINQtoSQL对象间的映射关系,在VisualStudio2008环境可自动完成,当然也可自行建立。537.4.2LINQtoSQL概述(续)要建立SQL7.4.2LINQtoSQL概述(续)MyPetShop.dbml定义了MyPetShop数据库的架构。MyPetShop.dbml.layout定义了每个表在设计视图中的布局。MyPetShop.designer.cs定义了自动生成的类,包括:派生自DataContext类以MyPetShopDataContext为类名,与MyPetShop数据库对应的类;以MyPetShop数据库中各表的表名作为类名的各实体类。547.4.2LINQtoSQL概述(续)MyPetSh7.4.2LINQtoSQL概述(续)实体类通过TableAttribute类的属性Name描述与数据表的映射关系。[Table(Name="dbo.Category")]实体类的属性通过ColumnAttribute类映射到数据库表的属性。[Column(Storage="_CategoryId",AutoSync=AutoSync.OnInsert,DbType="IntNOTNULLIDENTITY",IsPrimaryKey=true,IsDbGenerated=true)]557.4.2LINQtoSQL概述(续)实体类通过Ta7.4.2LINQtoSQL概述(续)通过AssociationAttribute类映射数据库表间的外键关系。//实体类Category中的定义[Association(Name="Category_Product",Storage="_Product",OtherKey="CategoryId")]//实体类Product中定义[Association(Name="Category_Product",Storage="_Category",ThisKey="CategoryId",IsForeignKey=true)]567.4.2LINQtoSQL概述(续)通过Assoc7.4.2LINQtoSQL概述(续)存储过程通过FunctionAttribute类实现映射并使用ParameterAttribute类描述存储过程的参数和方法的参数。[Function(Name="dbo.CategoryInsert")]publicintCategoryInsert([Parameter(Name="Name",DbType="VarChar(80)")]stringname,[Parameter(Name="Descn",DbType="VarChar(255)")]stringdescn)577.4.2LINQtoSQL概述(续)存储过程通过F7.4.3LINQtoSQL查询数据投影可采用select子句通过投影操作实现。投影后的结果将新生成一个对象,该对象通常是匿名的。

587.4.3LINQtoSQL查询数据投影58实例7-8使用LINQtoSQL实现投影本实例将创建包含ProductID、CategoryID、Name属性的匿名对象。源程序:LinqSqlQuery.aspx.cs中btnProject_Click()部分59实例7-8使用LINQtoSQL实现投影本实例将创建//建立MyPetShopDataContext对象实例dbMyPetShopDataContextdb=newMyPetShopDataContext();protectedvoidbtnProject_Click(objectsender,EventArgse){varresults=fromrindb.Productselectnew{r.ProductId,r.CategoryId,r.Name};GridView1.DataSource=results;GridView1.DataBind();}60//建立MyPetShopDataContext对象实例db选择实现了记录的过滤,由where子句完成。实例7-9利用LINQtoSQL实现选择源程序:LinqSqlQuery.aspx.cs中btnSelect_Click()部分61选择实现了记录的过滤,由where子句完成。61protectedvoidbtnSelect_Click(objectsender,EventArgse){varresults=fromrindb.Productwherer.UnitCost>20

selectr;GridView1.DataSource=results;GridView1.DataBind();}62protectedvoidbtnSelect_Click排序实例7-10利用LINQtoSQL实现排序本实例将使用orderby子句根据价格降序排列。源程序:LinqSqlQuery.aspx.cs中btnOrder_Click()部分63排序实例7-10利用LINQtoSQL实现排序63protectedvoidbtnOrder_Click(objectsender,EventArgse){varresults=fromrindb.Product

orderbyr.UnitCostdescendingselectr;GridView1.DataSource=results;GridView1.DataBind();}64protectedvoidbtnOrder_Click(分组使用group…by子句。与原始集合不同,分组后的结果集合将采用列表的列表形式。列表中的每个元素包括键值及根据该键值分组的元素列表。因此,要访问分组后的结果集合,必须使用嵌套的循环语句。外循环用于循环访问每个组,内循环用于循环访问每个组的元素列表。若要引用组操作的结果,可以使用into子句创建用于进一步查询的标识符。65分组使用group…by子句。65分组(续)实例7-11利用LINQtoSQL实现分组本实例根据CategoryID分组,并显示CategoryID值为5的列表。源程序:LinqSqlQuery.aspx.cs中btnGroup_Click()部分66分组(续)实例7-11利用LINQtoSQL实现分组protectedvoidbtnGroup_Click(objectsender,EventArgse){//按CategoryId分组后结果存入resultsvarresults=fromrindb.Product

grouprbyr.CategoryId;

foreach(varginresults){//获取键为5的列表数据

if(g.Key==5){varresults2=fromringselectr;GridView1.DataSource=results2;GridView1.DataBind();}}}67protectedvoidbtnGroup_Click(聚合主要涉及Count()、Max()、Min()、Average()等方法。当使用Max()、Min()、Average()等方法时,参数常使用Lambda表达式。“Lambda表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。所有Lambda表达式都使用Lambda运算符=>,该运算符读为“goesto”。该Lambda运算符的左边是输入参数(如果有),右边包含表达式或语句块。Lambda表达式x=>x*x读作“xgoestoxtimesx”。68聚合主要涉及Count()、Max()、Min()、AverLambda表达式(输入参数)=>{语句块}其中“输入参数”可以为空、1个或多个。当输入参数个数为1时,可省略括号;“=>”称为Lambda运算符,读作“goesto”;语句块反映了Lambda表达式的结果。当把Lambda表达式运用于Max()、Min()、Average()等聚合方法时,编译器会自动推断输入参数的数据类型。69Lambda表达式(输入参数)=>{语句块}69实例7-12利用LINQtoSQL实现聚合函数操作本实例根据CategoryID分组统计每组的个数、LastPrice的最大值、最小值和平均值。源程序:LinqSqlQuery.aspx.cs中btnPolymerize_Click()部分70实例7-12利用LINQtoSQL实现聚合函数操作本protectedvoidbtnPolymerize_Click(objectsender,EventArgse){varresults=fromrindb.Productgrouprbyr.CategoryIdintogselectnew{Key=g.Key,Count=g.Count(),MaxPrice=g.Max(p=>p.Price),MinPrice=g.Min(p=>p.Price),AvgPrice=g.Average(p=>p.Price)};GridView1.DataSource=results;GridView1.DataBind();}71protectedvoidbtnPolymerize_C附加内容Distinct()形式说明:筛选字段中不相同的值。用于查询不重复的结果集。生成SQL语句为:SELECTDISTINCT[City]FROM[Customers]varq=(fromcindb.Customersselectc.City).Distinct();语句描述:查询顾客覆盖的国家。72附加内容Distinct()形式72Count()形式说明:返回集合中的元素个数,返回INT类型。生成SQL语句为:SELECTCOUNT(*)FROM1.简单形式:得到数据库中客户的数量varq=db.Customers.Count();2.带条件形式:得到数据库中未断货产品的数量varq=db.Products.Count(p=>!p.Discontinued);73Count()形式73LongCount()形式说明:返回集合中的元素个数,返回LONG类型。对于元素个数较多的集合可视情况可以选用LongCount来统计元素个数,它返回long类型,比较精确。生成SQL语句为:SELECTCOUNT_BIG(*)FROMvarq=db.Customers.LongCount();74LongCount()形式74Sum()形式说明:返回集合中数值类型元素之和,集合应为INT类型集合。生成SQL语句为:SELECTSUM(…)FROM

1.简单形式:得到所有订单的总运费varq=db.Orders.Select(o=>o.Freight).Sum();2.映射形式:得到所有产品的订货总数varq=db.Products.Sum(p=>p.UnitsOnOrder);75Sum()形式75Min()形式说明:返回集合中元素的最小值。生成SQL语句为:SELECTMIN(…)FROM1.简单形式:查找任意产品的最低单价varq=db.Products.Select(p=>p.UnitPrice).Min();2.映射形式:查找任意订单的最低运费:varq=db.Orders.Min(o=>o.Freight);3.元素:查找每个类别中单价最低的产品:varcategories=frompindb.Products

grouppbyp.CategoryIDintog

selectnew{

CategoryID=g.Key,

CheapestProducts=fromp2ing

wherep2.UnitPrice==g.Min(p3=>p3.UnitPrice)

selectp2

};76Min()形式76Max()形式 说明:返回集合中元素的最大值;不延迟。 生成SQL语句为:SELECTMAX(…)FROM1.简单形式:查找任意雇员的最近雇用日期varq=db.Employees.Select(e=>e.HireDate).Max();

2.映射形式:查找任意产品的最大库存量varq=db.Products.Max(p=>p.UnitsInStock);

3.元素:查找每个类别中单价最高的产品varcategories=frompindb.Productsgrouppbyp.CategoryIDintogselectnew{g.Key,MostExpensiveProducts=fromp2ingwherep2.UnitPrice==g.Max(p3=>p3.UnitPrice) selectp2 };77Max()形式77Average()形式

说明:返回集合中的数值类型元素的平均值。集合应为数字类型集合,其返回值类型为double。

生成SQL语句为:SELECTAVG(…)FROM1.简单形式:得到所有订单的平均运费varq=db.Orders.Select(o=>o.Freight).Average();2.映射形式:得到所有产品的平均单价varq=db.Products.Average(p=>p.UnitPrice);3.元素:查找每个类别中单价高于该类别平均单价的产品varcategories=frompindb.Products

grouppbyp.CategoryIDintog

selectnew{

g.Key,

ExpensiveProducts=fromp2ing

wherep2.UnitPrice>g.Average(p3=>p3.UnitPrice)

selectp2

};78Average()形式78连接多表连接查询使用join子句。但对于具有外键约束的多表,可以直接通过引用对象的形式进行查询,当然也可以使用join子句实现。79连接多表连接查询使用join子句。但对于具有外键约束的多表实例7-13利用LINQtoSQL实现直接引用对象连接

本实例通过直接引用对象形式查询产品的分类名称。源程序:LinqSqlQuery.aspx.cs中btnQuote_Click()部分80实例7-13利用LINQtoSQL实现直接引用对象连protectedvoidbtnQuote_Click(objectsender,EventArgse){varresults=fromrindb.Productselectnew{r.ProductId,r.CategoryId,//直接引用Category对象

CategoryName=r.Category.Name};GridView1.DataSource=results;GridView1.DataBind();}81protectedvoidbtnQuote_Click实例7-14利用LINQtoSQL实现join连接本实例使用join子句实现与实例7-13一样的功能。源程序:LinqSqlQuery.aspx.cs中btnJoin_Click()部分82实例7-14利用LINQtoSQL实现join连接本protectedvoidbtnJoin_Click(objectsender,EventArgse){varresults=fromproductindb.Product

joincategoryindb.Categoryonproduct.CategoryIdequalscategory.CategoryIdselectnew{product.ProductId,product.CategoryId,CategoryName=category.Name};GridView1.DataSource=results;GridView1.DataBind();}83protectedvoidbtnJoin_Click(模糊查询使用时需调用System.Data.Linq.SqlClient.SqlMethods.Like()方法。84模糊查询使用时需调用System.Data.Linq.Sq实例7-15利用LINQtoSQL实现模糊查询本实例查询分类名中包含字母c的分类。源程序:LinqSqlQuery.aspx.cs中btnFuzzy_Click()部分85实例7-15利用LINQtoSQL实现模糊查询本实protectedvoidbtnFuzzy_Click(objectsender,EventArgse){varresults=fromrindb.CategorywhereSqlMethods.Like(r.Name,"%c%")selectr;GridView1.DataSource=results;GridView1.DataBind();}86protectedvoidbtnFuzzy_Click(7.4.4使用LINQtoSQL管理数据插入数据 利用InsertAllOnSubmit()和InsertOnSubmit()方法实现,前者用于插入集合数据实体,后者用于插入单个实体。877.4.4使用LINQtoSQL管理数据插入数据87实例7-16利用LINQtoSQL插入数据本实例将通过文本框获取属性Name和Descn的值,再插入到Category表。因为Category表在设计时已将CategoryID属性设置为标识,会自动递增,因此在插入数据时不需要插入属性CategoryID值。源程序:LinqSqlManageData.aspx.cs中btnInsert_Click()部分。88实例7-16利用LINQtoSQL插入数据本实例将通

protectedvoidShowData(){varresults=fromrindb.Categoryselectr;GridView1.DataSource=results;GridView1.DataBind();}protectedvoidbtnInsert_Click(objectsender,EventArgse){

Categorycategory=newCategory();//建立Category实例categorycategory.Name=txtName.Text;category.Descn=txtDescn.Text;

db.Category.InsertOnSubmit(category);//插入实体categorydb.SubmitChanges();//提交更改ShowData();//自定义方法,用于在GridView1中显示最新结果}89protectedvoidShowData()897.4.4使用LINQtoSQL管理数据(续)修改数据 需要根据某种信息找到需要修改的数据,如个人信息的修改需先通过身份验证,根据身份标识获取个人信息再修改。907.4.4使用LINQtoSQL管理数据(续)修改数据实例7-17利用LINQtoSQL修改数据本实例将直接获取根据输入的CategoryID确定的数据,再进行修改操作。因为CategoryID是标识,该值不能修改。源程序:LinqSqlManageData.aspx.cs中btnUpdate_Click()部分91实例7-17利用LINQtoSQL修改数据本实例将protectedvoidbtnUpdate_Click(objectsender,EventArgse){varresults=fromrindb.Categorywherer.CategoryId==int.Parse(txtCategoryID.Text)selectr;

if(results!=null){

foreach(Categoryrinresults){r.Name=txtName.Text;r.Descn=txtDescn.Text;}db.SubmitChanges();ShowData();}}92protectedvoidbtnUpdate_Click7.4.4使用LINQtoSQL管理数据(续)删除数据 利用DeleteAllOnSubmit()和DeleteOnSubmit()方法实现,前者用于删除实体集合,后者用于删除单个实体。937.4.4使用LINQtoSQL管理数据(续)删除数据实例7-18利用LINQtoSQL删除数据本实例将根据输入的CategoryID删除数据。源程序:LinqSqlManageData.aspx.cs中btnDelete_Click()部分94实例7-18利用LINQtoSQL删除数据本实例将根protectedvoidbtnDelete_Click(objectsender,EventArgse){varresults=fromrindb.Categorywherer.CategoryId==int.Parse(txtCategoryID.Text)selectr;db.Category.DeleteAllOnSubmit(results);db.SubmitChanges();ShowData();}95protectedvoidbtnDelete_Click7.4.4使用LINQtoSQL管理数据(续)存储过程 要使用原来SQLServer中定义的存储过程,需要在建立MyPetShop.dbml时将存储过程拖入到O/R设计器窗口,这样,VisualStudio2008会自动建立与存储过程对应的方法。在具体使用存储过程时,只要调用对象的方法就可以了。967.4.4使用LINQtoSQL管理数据(续)存储过程实例7-19利用LINQtoSQL调用存储过程本实例将利用存储过程实现数据插入操作。首先建立存储过程CategoryInsertLinq,再生成对应的CategoryInsertLinq()方法。源程序:存储过程CategoryInsertLinq源程序:LinqSqlManageData.aspx.cs中btnProcedure_Click()部分97实例7-19利用LINQtoSQL调用存储过程本实例protectedvoidbtnProcedure_C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论