ASP.NET程序设计教程(C#版)第4版 课件 第10、11章 使用ADO.NET访问数据库、LINQ to SQL数据库操作_第1页
ASP.NET程序设计教程(C#版)第4版 课件 第10、11章 使用ADO.NET访问数据库、LINQ to SQL数据库操作_第2页
ASP.NET程序设计教程(C#版)第4版 课件 第10、11章 使用ADO.NET访问数据库、LINQ to SQL数据库操作_第3页
ASP.NET程序设计教程(C#版)第4版 课件 第10、11章 使用ADO.NET访问数据库、LINQ to SQL数据库操作_第4页
ASP.NET程序设计教程(C#版)第4版 课件 第10、11章 使用ADO.NET访问数据库、LINQ to SQL数据库操作_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

第10章使用ADO.NET访问数据库本章讲述的主要内容10.1ADO.NET概述10.2数据库连接对象(Connection)10.3数据库命令对象(Command)10.4ExecuteReader()方法和DataReader对象10.5数据适配器对象(DataAdapter)10.6DataSet概述10.7使用DataSet对象访问数据库10.8实训设计一个课程表管理程序10.1ADO.NET概述10.1.1ADO.NET的数据模型

ADO.NET采用了层次管理的结构模型,各部分之间的逻辑关系如下图所示。10.1ADO.NET概述10.1.2ADO.NET中的常用对象

在ADO.NET中数据集与数据提供器是两个非常重要,而又相互关联的核心组件。它们二者之间的关系如下图所示。10.2数据库连接对象(Connection)10.2.2创建Connection对象

SqlConnection

连接对象名=newSqlConnection(连接字符串);或:

SqlConnection

连接对象名=newSqlConnection();

连接对象名.ConnectionString=连接字符串;

10.2数据库连接对象(Connection)10.2.2数据库的连接字符串1.连接字符串中的常用属性10.2数据库连接对象(Connection)10.2.2数据库的连接字符串2.连接到SQL

Server的连接字符串标准连接(2)信任连接10.2数据库连接对象(Connection)10.2.2数据库的连接字符串3.连接到OLEDB数据源的连接字符串(以连接Access数据库为例)连接到Access2003数据库:连接到Access2007/2010数据库:10.2数据库连接对象(Connection)10.2.2数据库的连接字符串4.连接字符串的存放位置(1)把连接字符串写在程序中一般的初级教程多采用这种方法。这样写当然没有错误,但是要在许多页面中写入连接字符串,这时候如果需要改动连接字符串(比如换用户名和密码)的话,就得逐个修改。(2)把连接字符串放在web.config文件中10.3数据库命令对象(Command)10.3.1创建Command对象1.使用构造函数创建Command对象

下面是使用构造函数创建SqlCommand对象,并通过该对象的构造函数参数来设置特定属性值,其语法格式如下:SqlCommand

命令对象名=newSqlCommand(查询字符串,连接对象名);或SqlCommand

命令对象名=newSqlCommand();命令对象名.Connection=连接对象名;命令对象名.CommandText=查询字符串;10.3数据库命令对象(Command)10.3.1创建Command对象2.使用CreateCommand()方法创建Command对象下面是使用Connection对象的CreateCommand()方法创建SqlCommand对象的语法格式:SqlCommandCommand对象名=Connection对象名.CreateCommand();Command对象名.CommandText=查询字符串;10.3数据库命令对象(Command)10.3.2Command对象的属性和方法常用属性

10.3数据库命令对象(Command)10.3.2Command对象的属性和方法常用方法10.4ExecuteReader()方法和DataReader对象10.4.1使用ExecuteReader()方法创建DataReader对象10.4ExecuteReader()方法和DataReader对象10.4.2DataReader对象的常用属性及方法1)FieldCount属性:该属性用来获取当前行中的列数,如果未放置在有效的记录集中,则返回0,否则返回列数(字段数),默认值为-1。2)HasRows属性:用来获取DataReader对象中是否包含任何行。3)Read()方法:使用该方法可将Reader指向当前记录,并将记录指针移到下一行,从而可使用列名或列的次序来访问列的值。如果到了数据表的最后,则返回一个布尔值false。4)GetValue()方法:5)GetValues()方法:6)NextResult()方法:7)Close()方法:参阅源代码:ex10-310.5数据适配器对象(DataAdapter)10.5.1DataAdapter对象概述DataAdapter对象是一个双向通道,用来把数据从数据源中读到一个内存表中,以及把内存中的数据写回到一个数据源中。两种情况下使用的数据源可能相同,也可能不相同。而这两种操作分别称作填充(Fill)和更新(Update)。DataAdapter对象通过Fill方法和Update方法来提供这一桥接器。10.5数据适配器对象(DataAdapter)10.5.2DataAdapter对象的属性和方法常用的创建SqlDataAdapter对象的语法格式如下所示:SqlDataAdapter

对象名=newSqlDataAdapter(SqlStr,conn);其中SqlStr为Select查询语句或SqlCommand对象,conn为SqlConnection对象。10.5数据适配器对象(DataAdapter)10.5.2DataAdapter对象的属性和方法1.DataAdapter对象的常用属性

DataAdapter对象的常用属性见下表10.5数据适配器对象(DataAdapter)10.5.2DataAdapter对象的属性和方法2.DataAdapter对象的常用方法

DataAdapter对象的常用方法见下表10.5数据适配器对象(DataAdapter)10.5.3DataTable对象DataTable对象是内存中一个关系数据库表,可以独立创建也可以由DataAdapter来填充。声明一个DataTable对象的语法格式如下所示:

DataTable

对象名=newDataTable();

一个DataTable对象创建后,通常需要调用DataAdapter的Fill()对其进行填充,使DataTable对象获得具体的数据集,而不再是一个空表对象。10.5数据适配器对象(DataAdapter)10.5.3DataTable对象1.创建DataTable对象在实际应用中使用DataTable对象一般需要经过以下几个步骤:①创建数据库连接。②创建Select查询语句或Command对象。③创建DataAdapter对象。④创建DataTable对象。⑤调用DataAdapter对象的Fill()方法填充DataTable对象。10.5数据适配器对象(DataAdapter)10.5.3DataAdapter对象的属性和方法2.DataTable对象的常用属性

Columns属性:该属性用于获取DataTable对象中表的列集合。

Rows属性:该属性用于获取DataTable对象中表的行集合。

DefaultView属性:该属性用于获取可能包括筛选视图或游标位置的表的自定义视图。10.6DataSet概述

DataSet(数据集)对象是ADO.NET的核心构件之一,它是数据的内存流表示形式,提供了独立于数据源的关系编程模型。DataSet表示整个数据集,其中包括有表、约束和表与表之间的关系。由于DataSet独立于数据源,故其中可以包含应用程序的本地数据,也可以包含来自多个数据源的数据。这是DataSet与前面介绍的DataTable的关键不同。

DataSet提供了对数据库的断开操作模式(也称为离线操作模式),当DataSet从数据源获取数据后就断开了与数据源之间的连接。在本地完成了各项数据操作(增、删、改、查等)后,可以将DataSet中的数据送回到数据源以更新数据库记录。10.6DataSet概述10.6.1DataSet与DataAdapter

DataSet是实现ADO.NET断开式连接的核心,它通过DataAdapter从数据源获得数据后就断开了与数据源之间的连接(这一点与前面介绍过的DataReader对象完全不同),此后应用程序所有对数据源的操作(定义约束和关系、添加、删除、修改、查询、排序、统计等)均转向到DataSet,当所有这些操作完成后可以通过DataAdapter提供的数据源更新方法将修改后的数据写入数据库。需要说明的是对于不同的数据源DataAdapter对象也有不同的形式,如用于连接Access数据库的OleDbDataAdapter,用于连接SQLServer数据库的SQLDataAdapter、用于连接ODBC数据源的OdbcDataAdapter、用于连接Oracle数据库的OracleDataAdapter等。10.6DataSet概述10.6.2DataSet的组成

10.6DataSet概述10.6.3DataSet中的对象、属性和方法1.DataSet中的对象

DataSet由大量相关的数据结构组成,其中最常用的有如下5个子对象,其名称及功能说明见下表。10.6DataSet概述10.6.3DataSet中的对象、属性和方法2.DataSet对象的常用属性

DataSet对象的常用属性见下表。10.6DataSet概述10.6.3DataSet中的对象、属性和方法3.DataSet对象的常用方法

DataSet对象的常用方法见下表。10.7使用DataSet访问数据库10.7.1创建DataSet创建数据集对象的语法格式为:DataSet

数据集对象名=newDataSet();或:DataSet

数据集对象名=newDataSet("表名");10.7使用DataSet访问数据库10.7.2填充DataSet所谓“填充”是指将DataAdapter对象通过执行SQL语句从数据源得到的返回结果,使用DataAdapter对象的Fill方法传递给DataSet对象。其常用语法格式如下所示:Adapter.Fill(ds);或:Adapter.Fill(ds,tablename);

10.7使用DataSet访问数据库10.7.3添加新记录通过DataSet向数据表添加新记录的一般方法如下:1)建立与数据库的连接。2)通过DataAdapter对象从数据库中取出需要的数据。3)实例化一个SqlCommandBuilder类对象,并为DataAdapter自动生成更新命令。4)使用DataAdapter对象的Fill方法填充DataSet。5)使用NewRow()方法向DataSet中填充的表对象中添加一个新行。6)为新行中各字段赋值7)将新行添加到DataSet中填充的表对象中。8)调用DataAdapter对象的Update()方法将数据保存到数据库。10.7使用DataSet访问数据库10.7.4修改记录通过DataSet修改现有数据表记录的操作方法与添加新记录非常相似,唯一不同的地方是无需使用NewRow()添加新行,而是创建一个DataRow对象后,从表对象中获得需要修改的行并赋给新建的DataRow对象,根据需要修改各列的值(为各字段赋以新值)。最后仍需要调用DataAdapter对象的Update()方法将更新提交到数据库。10.7使用DataSet访问数据库10.7.5删除记录

使用DataSet从填充的表对象中删除行时需要创建一个DataRow对象,并将要删除的行赋值给该对象,而后调用DataRow对象的Delete()方法将该行删除。当然此时的删除仅是针对DataSet对象的,若需从数据库中删除该行,还需要调用DataAdapter对象的Update()方法将删除操作提交到数据库。10.8实训设计一个课程表管理程序10.8.1实训目的①通过本实训进一步理解使用DataSet配合DataAdapter和DataReader对象完成数据库常规操作的一般步骤。②掌握ASP.NET标准控件的基本使用方法和常用属性。③本实训除应用到了DataSet、DataAdapter、DataReader等ADO.NET对象外,还涉及了许多SQL查询语句和通过ASP.NET内置对象,在不同页面间传递数据的技巧,这些都是开发Web数据库应用程序的基本手段,要求在实训中认真理解其含义及语句书写格式。10.8.2实训要求在ASP.NET环境中使用DataSet配合DataAdapter对象,创建一个简单的学校课程表管理程序。第11章LINQtoSQL数据库操作本章讲述的主要内容11.1LINQ的概念11.2使用LinqDataSource控件11.3使用LINQtoSQL的对象和方法11.4实训使用LINQtoSQL操作数据库

11.1LINQ的概念11.1.1LINQ的构成LINQ的组成架构如图所示。11.1LINQ的概念11.1.2与LINQ相关的几个概念1.匿名类型“匿名类型”也称为“隐式类型”或“推断类型”,如果在程序中需要使用到临时类型,而又不希望去创建相应的类时,可以考虑使用匿名类型。匿名类型使用var关键字进行声明。例如:var

stuinfo=new{StuName="张三",StuID="2009000234",StuAge=20};11.1LINQ的概念11.1.2与LINQ相关的几个概念2.泛型要使用泛型需要引入System.Collections.Generic命名空间。例如,下列语句声明并初始化了一个名为MyGeneric,用于表述一个字符串列表的泛型集合。List<string>MyGeneric=newLinst<string>;MyGeneric.Add("zhangsan");MyGeneric.Add("2009000234");MyGeneric.Add("工程机械0901");在VisualStudio2008中可以将上述代码简化为如下所示:List<string>MyGeneric=newLinst<string>{"zhangsan","2016000234","工程机械1601"};11.1LINQ的概念11.1.2与LINQ相关的几个概念3.扩展方法使用扩展方法可以为一些现有的类增加某种特定的功能。也就是向一个现有的类中添加新的静态方法(注意必须是静态的)。创建扩展方法的语法格式如下所示:publicstaticclass静态类名称{publicstatic返回值类型方法名称(this作用类型形参1[,形参2]……){扩展方法的方法体语句}}11.1LINQ的概念11.1.2与LINQ相关的几个概念4.Lambda表达式

Lambda表达式是.NETFramework3.5的一个新特性,它提供了一种极为简洁的定义方法的方式。它是从.NETFramework1.0中的“委托”和.NETFramework2.0中的“匿名方法”过渡而来的。(1)委托:委托实际上是一个函数指针,将问题的处理指向一个方法。(2)匿名方法:在实际应用中被调用方法的具体名称无关紧要,关键是方法体的返回值。所以在.NETFramework2.0中引入了“匿名方法”的概念。如下列代码所示,使用匿名方法无需首先创建方法,而是将方法体语句直接书写到委托实例化语句中,并用大括号将其括起来

11.1LINQ的概念11.1.2与LINQ相关的几个概念4.Lambda表达式

(3)过渡到Lambda表达式

Lambda表达式是一个匿名函数,它可以包含表达式和语句块。可用于创建委托或表达式目录树类型。所有Lambda表达式都使用Lambda运算符“=>”,该运算符读为“goesto”。该运算符的左边是输入参数(如果有的话),右边包含表达式或语句块。11.1LINQ的概念11.1.2与LINQ相关的几个概念5.对象关系设计器对象关系设计器也称为O/R设计器,用来自动生成与数据库表对应的DataConText类。DataConText类是LINQtoSQL框架的主入口点,所有实体对象与关系型数据库中数据的转换就是依靠DataConText类来完成的。创建DataConText类可以通过手工的方法,也可以使用O/R设计器自动完成。当我们向ASP.NET网站中添加一个“LINQtoSQL类”时,系统将自动打开O/R设计器。从服务器资源管理器窗口中,将数据库表、存储过程等拖动到O/R设计器中,即可自动生成需要的DataConText类或方法。11.2使用LinqDataSource控件11.2.1创建DataContext类5.对象关系设计器1)添加一个LINQtoSQL类的新项2)屏幕自动切换到O/R设计器窗口3)数据表从服务器资源管理器中拖动到O/R设计器的左窗格11.2使用LinqDataSource控件11.2.2配置LinqDataSource使用LinqDataSource配置向导。11.2使用LinqDataSource控件11.2.3LinqDataSource控件使用示例本节将以一个实例说明使用LinqDataSource控件配合FormView控件现实常规数据库操作的方法。

参阅源代码:ex11-211.3使用LINQtoSQL的对象和方法11.3.1返回数据表中的全部记录(select语句)1.返回全部记录的全部列下面的代码说明了在此基础上如何使用LINQtoSQL返回数据表StudentInfo中所有数据的方法。protectedvoidButton1_Click(objectsender,EventArgse){DataClassesDataContext

db=new

DataClassesDataContext();

var

Stuinfo=fromStuTablein

db.StudentInfoselectStuTable;GridView1.DataSource=Stuinfo;GridView1.DataBind();}11.3使用LINQtoSQL的对象和方法11.3.1返回数据表中的全部记录(select语句)2.返回全部记录的部分字段如果希望只返回全部记录的部分字段值(例如,只返回“学号”studentID和“电子邮件”Email),可将select子句改为如下内容。其中,new{StuTable.StudentID,StuTable.Email}语句创建了一个包含了2个属性的新匿名类型。selectnew{StuTable.StudentID,StuTable.Email};11.3使用LINQtoSQL的对象和方法11.3.1返回数据表中的全部记录(select语句)3.返回某条记录的某个字段值下列语句表示了从查询结构中取出某行某列值的方法。语句使用ToList()方法,将sinfo转换成List<>泛型集合后,取出其中的字段值,即将查询结果中第一条记录的StudentID字段值显示到标签控件中。protectedvoidButton1_Click(objectsender,EventArgse){DataClassesDataContext

db=new

DataClassesDataContext();

var

StuInfo=fromStuTableindb.StudentInfoselectStuTable;Label1.Text=StuInfo.ToList()[0].StudentID;}11.3使用LINQtoSQL的对象和方法11.3.1返回数据表中的全部记录(select语句)4.遍历某字段的全部值下列代码表示了使用foreach循环遍历studentID字段,并将该字段的所有值添加到列表框控件ListBox1中的方法。protectedvoidButton1_Click(objectsender,EventArgse){

DataClassesDataContext

db=newDataClassesDataContext();

foreach(varsindb.StudentInfo){

ListBox1.Items.Add(s.StudentID);}}11.3使用LINQtoSQL的对象和方法11.3.2返回数据表中符合条件的部分记录(Where语句)使用Where语句下列语句(斜体字部分)通过Where语句设置了条件表达式,筛选出专业为“软件技术”,且“1991-02-01”前出生的所有记录。protectedvoidLinqWhere_Click(objectsender,EventArgse){

DataClassesDataContext

db=newDataClassesDataContext();

var

StuInfo=fromStuTableindb.StudentInfo

whereStuTable.Specialty=="软件技术"&&

StuTable.DateOfBirth<DateTime.Parse("1991-02-01")selectStuTable;GridView1.DataSource=StuInfo;GridView1.DataBind();}11.3使用LINQtoSQL的对象和方法11.3.2返回数据表中符合条件的部分记录(Where语句)2.使用Where()方法通常将上面代码的编写方式称为“语句方式”,将使用Lambda表达式的编写方式称为“方法方式”,实现程序功能的方法方式代码如下所示。代码中斜体字部分使用db.StudentInfo对象的Where()方法,并使用Lambda表达式表示了查询条件。程序的返回结果与上例完全相同。protectedvoidLinqWhere_Click(objectsender,EventArgse){

DataClassesDataContext

db=newDataClassesDataContext();

var

StuInfo=db.StudentInfo.Where(m=>m.Specialty=="软件技术"&&

m.DateOfBirth<DateTime.Parse("1991-02-01"));GridView1.DataSource=StuInfo;GridView1.DataBind();}11.3使用LINQtoSQL的对象和方法11.3.2返回数据表中符合条件的部分记录(Where语句)3.Single()和SingleOrDefault()方法如果希望从数据库中返回单独的一条记录,可使用Single()或SingleOrDefault()方法。其中:1)Single()方法:用于返回符合条件的单独一条记录,在没有找到任何匹配记录时将抛出一个异常。2)SingleOrDefault()方法:用于返回符合条件的单独一条记录,在没有找到任何匹配的记录时将返回null。11.3使用LINQtoSQL的对象和方法11.3.2返回数据表中符合条件的部分记录(Where语句)4.返回字段值包含特定字符串的记录可以在LINQtoSQL查询中使用的字符串方法有许多,如:Length、Substring、Contains、StartsWith、EndsWith、IndexOf等等。11.3使用LINQtoSQL的对象和方法11.3.3返回数据集合的排序(OrderBy方法)使用OrdreBy()方法或OrderByDescending()方法,可以实现返回记录的升序或降序排列。protectedvoidLinqOrderBy_Click(objectsender,EventArgse){

DataClassesDataContext

db=new

DataClassesDataContext();GridView1.DataSource=db.StudentInfo.OrderBy(m=>m.DateOfBirth);GridView1.DataBind();}11.3使用LINQtoSQL的对象和方法11.3.4连接不同数据表(Join语句)

温馨提示

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

评论

0/150

提交评论