第5章〓ADO.NET技术 本章学习目标  理解ADO.NET的相关概念及其结构;  理解ADO.NET的五大对象;  掌握数据库的两种访问模式及其区别;  掌握使用ADO.NET技术操作数据的常用方法。 本章介绍ADO.NET技术,主要讲解ADO.NET的相关概念、ADO.NET的结构、五大对象、两种数据库访问模式,最后用案例讲解使用ADO.NET技术操作数据的常用方法。 5.1ADO.NET简介 5.1.1ADO.NET的相关概念 1. 什么是ADO 微软公司的ADO (ActiveX Data Objects)是一个用于存取数据源的COM组件。COM是微软公司为了使计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下人们可以开发出各种各样功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。 ADO提供了编程语言和统一数据访问方式(OLE DB)的一个中间层。OLE的全称是Object Link and Embed,即对象连接与嵌入。ADO允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,只用关心数据库的连接。 ADO最普遍的用法就是在关系数据库中查询一个表或多个表,然后在应用程序中检索并显示查询结果,还允许用户更改并保存数据。 2. 什么是ADO.NET ADO.NET是微软公司提出的访问数据库的一项新技术。ADO.NET的名称起源于ADO,是ADO的升级版本,是一个类库,主要用于.NET Framework平台对数据的操作。它提供了一致的对象模型,可以存取和编辑各种数据源的数据,为这些数据源提供一致的数据处理方式。之所以使用ADO.NET这个名称,是因为微软公司希望表明这是在.NET编程环境中优先使用的数据访问接口。 5.1.2ADO.NET的结构 1. ADO.NET模型 ADO.NET采用了层次管理模型,各部分之间的逻辑关系如图5.1所示。 图5.1ADO.NET模型 ADO.NET模型的最顶层是Web应用程序,中间是ADO.NET数据层和数据提供程序,在这个层次中数据提供程序相当于ADO.NET的通用接口,各种不同的数据源要使用不同的数据提供程序。它相当于一个容器,包括一组类及相关的命令,是数据源DataSource与数据集DataSet之间的桥梁,负责将数据源中的数据读到数据集中,也可将用户处理完毕的数据集保存到数据源中。 2. ADO.NET的组件 ADO.NET提供了两个主要的组件来访问和操作数据,它们分别是.NET Framework数据提供程序和数据集DataSet。数据集DataSet临时存储应用程序从数据源读取的数据,可以对数据进行各种操作; 数据提供程序用于建立数据集和数据源的连接。数据提供程序和数据集之间的关系如图5.2所示。 图5.2ADO.NET的结构图 5.2ADO.NET的五大对象 ADO.NET对象是指包含在.NET Framework数据提供程序和数据集DataSet中的对象,其中,DataSet对象是驻留在内存中的数据库,位于System.Data命名空间下。ADO.NET从数据库抽取数据后数据就存放在DataSet中,故可以把DataSet看成一个数据容器。.NET Framework数据提供程序包括Connection对象、Command对象、DataReader对象和DataAdapter对象。ADO.NET五大对象之间的关系如图5.3所示。 图5.3ADO.NET的五大对象 ADO.NET的五大对象可以形象地记为连接Connection、执行Command、读取DataReader、分配DataAdapter、填充DataSet。这正是ADO.NET对数据库操作的一般步骤。 .NET Framework数据提供程序包括的4个对象提供了对数据库的各种不同的访问功能,对于不同的数据库,区别仅是前缀不同。例如,连接SQL Server数据库使用的对象名称为SqlConnection、SqlCommand、SqlDataReader、SqlDataAdapter,连接Access数据库使用的对象名称为OleDbConnection、OleDbCommand、OleDbDataReader、OleDbDataAdapter,连接Oracle数据库使用的对象名称是OracleConnection、OracleCommand、OracleDataReader、OracleDataAdapter。 5.2.1Connection对象 1. Connection对象概述 在开发Web应用程序时需要与数据库进行交互,在和数据库进行交互之前必须实现和数据库的连接。使用Connection对象可以实现与数据库的连接。 对于ADO.NET,不同的数据源对应着不同的Connection对象。具体的Connection对象如表5.1所示。对于Command对象、DataReader对象和DataAdapter对象也是如此,后面不再赘述。 表5.1Connection对象 名称 命 名 空 间 描述 SqlConnection System.Data.SqlClient 表示与SQL Server数据库的连接对象 OleDbConnection System.Data.OleDb 表示与OleDb数据源的连接对象 OdbcConnection System.Data.Odbc 表示与ODBC数据源的连接对象 OracleConnection System.Data.OracleClient 表示与Oracle数据库的连接对象 2. Connection对象的常用属性 1) ConnectionString属性 Connection对象的数据库连接字符串保存在ConnectionString属性中,可以使用该属性获取或设置数据库的连接字符串。 2) State属性 State属性用来显示当前Connection对象的状态,有Open和Closed两种状态。 3. Connection对象的常用方法 1) Open()方法 使用Open()方法打开数据库连接。 2) Close()方法 使用Close()方法关闭数据库连接。 4. 使用Connection对象连接数据库 ADO.NET使用SqlConnection对象与SQL Server进行连接。下面介绍如何连接SQL Server数据库。 1) 定义数据库连接字符串 定义连接字符串的常用方式有两种。 (1) 使用Windows身份验证。 该方式也称为信任连接,这种连接方式有助于在连接到SQL Server时提供安全保护,因为它不会在连接字符串中公开用户ID和密码,是安全级别要求较高时推荐的数据库连接方法。其连接字符串的语法格式如下。 string ConnStr="Server=服务器名或IP; Database=数据库名;Integrated Security=true; "; Data Source(或Server)指定了SQL Server服务器的名字或IP地址,可以用localhost或圆点“.”表示本机。Integrated Security=true(或Integrated Security=SSPI,SSPI是Security Support Provider Interface的缩写)表示采用信任连接方式,即用Windows账号登录到SQL Server数据库服务器。Database(或Initial Catalog)用于设置登录到哪个数据库中。 (2) 使用SQL Server身份验证。 该方式也称为非信任连接,这种连接方式把未登录的用户ID和密码写在连接字符串中,因此在安全级别要求较高的场合不要使用。其连接字符串的语法格式如下。 string ConnStr="Server=服务器名或IP; Database=数据库名; uid=用户名;pwd=密码"; uid表示SQL Server登录用户名,pwd表示SQL Server登录密码。 2) 创建Connection对象 这里以创建的数据库连接字符串为参数,调用SqlConnection类的构造方法创建Connection对象,其语法格式如下。 SqlConnection连接对象名=new SqlConnection(连接字符串); 用户也可以首先使用构造函数创建一个不含参数的Connection对象,再通过Connection对象的ConnectionString属性设置连接字符串,其语法格式如下。 SqlConnection连接对象名=new SqlConnection(); 连接对象名.ConnectionString=连接字符串; 以上两种方法在功能上是等效的,选择哪种方法取决于用户的个人喜好和编码风格,不过属性经过明确设置可以使代码更容易理解和调试。 3) 打开数据库连接 连接对象名.Open(); 5. 应用举例 【案例5.1】使用Connection对象连接数据库。 使用Connection对象建立与SQL Server数据库test的连接,并显示当前数据库的连接状态。 1) 新建一个空网站 方法略。 2) 新建网页Default.aspx 设置网页标题为“使用Connection对象连接数据库”。在页面中添加一个标签控件和两个命令按钮,两个命令按钮的Text属性分别为“打开连接”和“关闭连接”。 3) 编写程序代码 添加命名空间的引用,代码如下。 using System.Data.SqlClient; 在所有事件之外定义数据库连接对象,代码如下。 static string constr="Server=.;Database=test;Integrated Security=true"; SqlConnection conn=new SqlConnection(constr); 在页面载入时执行的事件代码如下。 protected void Page_Load(object sender, EventArgs e) { Label1.Text="当前连接状态是: "+conn.State.ToString(); } “打开连接”按钮被单击时执行的事件代码如下。 protected void Button1_Click(object sender, EventArgs e) { conn.Open();Label1.Text="当前连接状态是: "+conn.State.ToString(); } “关闭连接”按钮被单击时执行的事件代码如下。 protected void Button2_Click(object sender, EventArgs e) { conn.Close();Label1.Text="当前连接状态是: "+conn.State.ToString(); } 图5.4使用Connection对象连接数据库 4) 运行页面 按Ctrl+F5组合键运行页面,显示的连接状态是Closed,打开连接时显示的连接状态是Open,运行效果如图5.4所示。 5.2.2Command对象 1. Command对象概述 ADO.NET的Command对象就是SQL命令或者对存储过程的引用。除了检索、更新数据之外,Command对象可用来对数据源执行一些不返回结果集的查询任务,以及用来执行改变数据源结构的数据定义命令。 在使用Connection对象与数据源建立连接后,可以使用Command对象对数据源执行查询、添加、删除和修改等各种操作,操作的实现可以使用SQL语句,也可以使用存储过程。根据所用的.NET Framework数据提供程序的不同,Command对象可以分成4种,分别是SqlCommand、OleDbCommand、OdbcCommand和OracleCommand,在实际的编程过程中应该根据访问的数据源不同选择相应的Command对象。 2. Command对象的常用属性 (1) Connection属性: 获取或设置此Command对象使用的Connection对象的名称。 (2) CommandText属性: 获取或设置对数据源执行的SQL语句或存储过程名。 (3) CommandType属性: 获取或设置Command对象要执行命令的类型。 3. Command对象的常用方法 (1) ExecuteNonQuery()方法: 执行CommandText属性指定的内容,并返回受影响的行数。 (2) ExecuteReader()方法: 执行CommandText属性指定的内容,并创建DataReader对象。 (3) ExecuteScalar()方法: 执行查询,并返回查询所返回的结果集中第一行的第一列。 4. 创建Command对象 Command对象的构造函数的参数有两个,一个是需要执行的SQL语句,另一个是数据库连接对象。这里以它们为参数,调用SqlCommand类的构造方法创建Command对象,其语法格式如下。 SqlCommand命令对象名=new SqlCommand (SQL语句,连接对象); 用户也可以首先使用构造函数创建一个不含参数的Command对象,再设置Command对象的Connection属性和CommandText属性,其语法格式如下。 SqlCommand命令对象名=new SqlCommand (); 命令对象名.Connection=连接对象; 命令对象名.CommandText=SQL语句; 5.2.3DataReader对象 1. DataReader对象概述 当Command对象返回结果集时需要使用DataReader对象来检索数据。DataReader对象返回一个来自Command的只读的、只能向前的数据流。DataReader每次只能在内存中保留一行,所以开销非常小,提高了应用程序的性能。 由于DataReader只执行读操作,并且每次只在内存缓冲区里存储结果集中的一条数据,所以使用DataReader对象的效率比较高,如果要查询大量数据,同时不需要随机访问和修改数据,DataReader是优先的选择。 2. DataReader对象的常用属性 (1) FieldCount属性: 表示由DataReader得到的一行数据中的字段数。 (2) HasRows属性: 表示DataReader是否包含数据。 (3) IsClosed属性: 表示DataReader对象是否关闭。 3. DataReader对象的常用方法 (1) Read()方法: 返回SqlDataReader的第一条,并一条一条地向下读取。 (2) GetName()方法: 通过输入列索引获得该列的名称。 (3) GetDataTypeName()方法: 通过输入列索引获得该列的类型。 (4) GetValue()方法: 根据传入的列的索引值返回当前记录行里指定列的值。 (5) Close ()方法: 关闭DataReader对象。 (6) IsNull()方法: 判断指定索引号的列的值是否为空,返回true或false。 4. 创建DataReader对象 如果要创建一个DataReader对象,可以通过Command对象的ExecuteReader()方法,其语法格式如下。 SqlDataReader数据读取器对象=命令对象名. ExecuteReader(); 5.2.4DataAdapter对象 1. DataAdapter对象概述 DataAdapter(即数据适配器)对象是一种用来充当DataSet对象与实际数据源之间桥梁的对象。DataSet对象是一个非连接的对象,它与数据源无关。DataAdapter正好负责填充它,并把它的数据提交给一个特定的数据源,它与DataSet配合使用可以执行新增、查询、修改和删除等多种操作。 DataAdapter对象是一个双向通道,用来把数据从数据源中读到一个内存表中,以及把内存中的数据写回到一个数据源中。这两种情况下使用的数据源可能相同,也可能不相同。这两种操作分别称为填充(Fill)和更新(Update)。 2. DataAdapter对象的常用属性 (1) SelectCommand属性: 获取或设置一个语句或存储过程,在数据源中选择记录。 (2) UpdateCommand属性: 获取或设置一个语句或存储过程,更新数据源中的记录。 (3) InsertCommand属性: 获取或设置一个语句或存储过程,在数据源中插入新记录。 (4) DeleteCommand属性: 获取或设置一个语句或存储过程,从数据源中删除记录。 3. DataAdapter对象的常用方法 (1) Fill()方法: 把从数据源读取的数据行填充到DataSet对象中。 (2) Update()方法: 在DataSet对象中的数据有所改动后更新数据源。 4. 创建DataAdapter对象 DataAdapter对象的构造函数的参数有两个,一个是需要执行的SQL语句,另一个是数据库连接对象。这里以它们为参数,调用SqlDataAdapter类的构造方法创建DataAdapter对象,其语法格式如下。 SqlDataAdapter数据适配器对象名=new SqlDataAdapter (SQL语句,连接对象); 用户也可以首先使用构造函数创建一个不含参数的DataAdapter对象,再设置DataAdapter对象的Connection属性和CommandText属性,其语法格式如下。 SqlDataAdapter数据适配器对象名=new SqlDataAdapter(); 数据适配器对象名.Connection=连接对象; 数据适配器对象名.CommandText=SQL语句; 5.2.5DataSet对象 1. DataSet对象概述 DataSet对象是ADO.NET的核心组件之一。ADO.NET从数据库抽取数据后将数据存放在DataSet中,故可以把DataSet看成一个数据容器,或称为“内存中的数据库”。 DataSet从数据源中获取数据后就断开了与数据源之间的连接。用户可以在DataSet中对记录进行插入、删除、修改、查询、统计等,在完成了各项操作后还可以把DataSet中的数据送回数据源。 每一个DataSet都是一个或多个DataTable对象的集合,DataTable相当于数据库中的表。DataTable对象的常用属性主要有Columns属性、Rows属性和DefaultView属性。  Columns属性: 用于获取DataTable对象中表的列集合。  Rows属性: 用于获取DataTable对象中表的行集合。  DefaultView属性: 用于获取表的自定义视图。 2. DataSet对象的常用属性 (1) Tables: 获取包含在DataSet中的表的集合。用户可以通过索引来引用Tables集合中的一个表,例如Tables[i]表示第i个表,其索引值从0开始编号。 (2) DataSetName: 获取或设置当前DataSet的名称。 3. DataSet对象的常用方法 (1) Clear()方法: 删除DataSet对象中的所有表。 (2) Copy()方法: 复制DataSet对象的结构和数据到另外一个DataSet对象中。 4. 创建DataSet对象 使用程序代码创建DataSet对象有两种方法。 第一种方法是先创建一个空的数据集对象,再把建立的数据表放到该数据集中,这种方法的语法格式如下。 DataSet数据集对象名=new DataSet(); 第二种方法是先建立数据表,再创建包含数据表的数据集,这种方法的语法格式如下。 DataSet数据集对象名=new DataSet("表名"); 5.3数据库访问模式 通过ADO.NET执行数据库操作的过程如下。 (1) 导入相应的命名空间。 (2) 使用Connection对象建立与数据库的连接。 (3) 使用Command对象或DataAdapter对象对数据库执行SQL命令,实现对数据库的查询、插入、更新和删除操作。 (4) 通过DataSet对象或DataReader对象访问数据。 (5) 使用数据显示控件或输出语句显示数据。 ADO.NET访问数据库的过程如图5.5所示。 图5.5ADO.NET访问数据库的过程 由图5.5可知,在ADO.NET中有两种访问数据库的模式,一种是连接模式,在保持数据库连接的方式下通过执行指定的SQL语句完成对数据的操作,数据的操作在断开数据库连接之前; 另一种是断开模式,先将数据库中的数据读取到服务器的DataSet或者DataTable中,数据的操作在断开数据库连接之后。 5.3.1连接模式 1. 使用连接模式访问数据库 (1) 创建Connection对象与数据库建立连接。 (2) 创建Command对象对数据库执行SQL命令或存储过程,包括增、删、改及查询数据库等命令。 (3) 打开与数据库的连接。 (4) 执行操作数据库的命令,如果查询数据库的数据,则创建DataReader对象读取Command命令查询到的结果集,并将查询到的结果集绑定到控件上。 (5) 关闭与数据库的连接。 2. 操作数据库的两种方法 Command对象提供了多种完成数据库操作的方法,下面介绍常用的两种方法。 1) ExecuteReader()方法 ExecuteReader()方法提供了顺序读取数据库的方法,该方法根据提供的select语句返回一个DataReader对象,开发人员可以使用DataReader对象的Read()方法循环依次读取每条记录中各字段的内容。 【案例5.2】使用ExecuteReader()方法读取数据。 将test数据库的staff表中的姓名和职称字段显示在ListBox控件中。 (1) 新建一个空网站。 方法略。 (2) 新建网页Default.aspx。 设置网页标题为“使用ExecuteReader()方法读取数据”。在页面中添加一个ListBox控件,其ID属性采用默认的ListBox1。 (3) 编写程序代码。 添加命名空间的引用,代码如下。 using System.Data.SqlClient; 在页面载入时执行的事件代码如下。 protected void Page_Load(object sender, EventArgs e) { string constr="Server=.;Database=test;Integrated Security=true"; SqlConnection conn=new SqlConnection(constr); SqlCommand comm=new SqlCommand(); comm.Connection=conn; comm.CommandText="select*from staff"; conn.Open(); SqlDataReader dr=comm.ExecuteReader(); while(dr.Read()) { this.ListBox1.Items.Add(string.Format("{0}\t{1}",dr[1],dr[3])); } conn.Close(); } 图5.6使用ExecuteReader()方法读取数据 (4) 运行页面。 按Ctrl+F5组合键运行页面,在列表框中显示了staff表中的姓名和职称字段,运行效果如图5.6所示。 2) ExecuteNonQuery()方法 ExecuteNonQuery()方法执行SQL语句,并返回因操作受影响的行数。一般将其用于update、insert、delete或select语句直接操作数据库中的表数据。对于update、insert、delete语句,ExecuteNonQuery()方法的返回值为该语句所影响的行数; 而对于select语句,由于执行select语句后数据库并无变化,所以其返回值为-1。 【案例5.3】使用ExecuteNonQuery()方法更新数据。 根据输入的金额数,将test数据库的staff表中职称为“助教”的职工的工资增加。 (1) 新建一个空网站。 方法略。 (2) 新建网页Default.aspx。 设置网页标题为“使用ExecuteNonQuery()方法更新数据”。在页面中添加一个GridView控件、一个Label控件、一个TextBox控件和一个Button控件,Label控件的Text属性为“增加工资值:”,Button控件的Text属性为“加工资”,所有控件的ID均采用默认名称。 (3) 编写程序代码。 添加命名空间的引用,代码如下。 using System.Data.SqlClient; 在所有事件之外定义数据库连接对象,代码如下。 static string constr="Server=.;Database=test;Integrated Security=true"; SqlConnection conn=new SqlConnection(constr); 在页面载入时创建SqlCommand对象,设置SQL查询语句,打开数据库连接,使用SqlDataReader对象来获取数据源,然后定义GridView控件的标题,把数据源绑定到GridView控件上,并显示出来。Page_Load事件的代码如下。 protected void Page_Load(object sender, EventArgs e) { SqlCommand comm=new SqlCommand(); comm.Connection=conn; comm.CommandText="select*from staff"; conn.Open(); SqlDataReader dr=comm.ExecuteReader(); this.GridView1.Caption="加工资前的职工信息表"; this.GridView1.DataSource=dr; this.GridView1.DataBind(); conn.Close(); } “加工资”按钮被单击时执行的事件代码如下。 protected void Button1_Click(object sender, EventArgs e) { SqlCommand cmd=new SqlCommand(); cmd.Connection=conn; cmd.CommandText="update staff set Salary=Salary+"+this.TextBox1.Text.Trim() +"where Title='助教'"; conn.Open(); int iValue=cmd.ExecuteNonQuery(); if (iValue > 0) { cmd.CommandText="select*from staff"; SqlDataReader dr=cmd.ExecuteReader(); this.GridView1.Caption="加工资后的职工信息表"; this.GridView1.DataSource=dr; this.GridView1.DataBind(); TextBox1.Text=""; } conn.Close(); } (4) 运行页面。 按Ctrl+F5组合键运行页面,加工资前的职工信息表如图5.7所示。 图5.7加工资前的职工信息表 假设要给助教增加350元工资,则在文本框中输入350,单击“加工资”按钮,加工资后的职工信息表如图5.8所示。 图5.8加工资后的职工信息表 5.3.2断开模式 1. 断开模式概述 DataSet对象包含多个DataTable对象,用于存储与数据源断开连接的数据。DataAdapter对象可以作为数据库和内存之间的桥梁,使用DataAdapter对象的Fill()方法可以提取查询结果并填充到DataTable中,然后关闭连接,此时处于非连接状态,然后应用程序继续处理离线的DataSet数据。 2. 使用断开模式访问数据库 1) 使用断开模式查询数据的步骤 (1) 创建Connection对象与数据库建立连接。 (2) 创建DataAdapter对象,并设置select语句。 (3) 创建DataSet对象或者DataTable对象。 (4) 使用DataAdapter的Fill()方法填充DataSet。 (5) 使用数据控件对数据进行显示。 2) 使用断开模式编辑数据的步骤 (1) 创建Connection对象与数据库建立连接。 (2) 创建DataAdapter对象,并设置select语句。 (3) 创建CommandBuilder对象。 (4) 创建DataSet对象或者DataTable对象。 (5) 使用DataAdapter的Fill()方法填充DataSet。 (6) 使用数据控件对数据进行插入、更新或删除操作。 (7) 调用DataAdapter对象的Update()方法更新数据库。 3. 应用举例 【案例5.4】使用DataAdapter对象添加数据。 使用DataAdapter对象对test数据库中的staff表进行操作,添加新记录。 1) 新建一个空网站 方法略。 2) 新建网页Default.aspx 设置网页标题为“使用DataAdapter对象添加数据”。在页面中添加一个GridView控件、5个Label控件、5个TextBox控件和一个Button控件,所有控件的ID均采用默认名称,设计视图如图5.9所示。 图5.9案例5.4的设计视图 3) 编写程序代码 添加命名空间的引用,代码如下。 using System.Data; using System.Data.SqlClient; 在所有事件之外定义数据库连接字符串,代码如下。 static string constr="Server=.;Database=test;Integrated Security=true"; 在页面载入时使用断开模式查询数据。先创建SqlDataAdapter对象,再创建DataTable对象dt,把SqlDataAdapter对象中的数据填充到dt中,然后把dt绑定到GridView控件上显示出来。Page_Load事件的代码如下。 protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { using (SqlConnection conn=new SqlConnection(constr)) { SqlDataAdapter da=new SqlDataAdapter("select*from staff", conn); DataTable dt=new DataTable(); da.Fill(dt); this.GridView1.DataSource=dt; this.DataBind(); } } } 说明: 释放与数据库的连接除了使用SqlConnection对象的Close()方法外,还有一种方法就是使用using语句。在using语句中不再使用Close()方法,一旦using模块结束,系统立即关闭与相关对象的连接。 在“添加”按钮的单击事件中使用断开模式插入数据,代码如下。 protected void Button1_Click(object sender, EventArgs e) { using (SqlConnection conn=new SqlConnection(constr)) { SqlDataAdapter da=new SqlDataAdapter("select*from staff", conn); SqlCommandBuilder builder=new SqlCommandBuilder(da); da.InsertCommand=builder.GetInsertCommand(); DataTable dt=new DataTable(); da.Fill(dt); this.TextBox1.Focus(); DataRow row=dt.NewRow(); row[0]=this.TextBox1.Text.Trim(); row[1]=this.TextBox2.Text.Trim(); row[2]=this.TextBox3.Text.Trim(); row[3]=this.TextBox4.Text.Trim(); row[4]=this.TextBox5.Text.Trim(); dt.Rows.Add(row); da.Update(dt); this.GridView1.DataSource=dt; this.DataBind(); } } 说明: 创建SqlCommandBuilder对象,根据SqlDataAdapter对象提供的select语句和连接字符串,利用SqlCommandBuilder对象的GetInsertCommand()方法、GetUpdateCommand()方法、GetDeleteCommand()方法为SqlDataAdapter对象生成InsertCommand、UpdateCommand和DeleteCommand,这样就可以调用DataAdapter对象的Update方法更新数据库。 4) 运行页面 按Ctrl+F5组合键运行页面,运行效果如图5.10所示。 图5.10使用DataAdapter对象添加数据 5.3.3两种访问模式的区别 连接模式是指客户端始终与数据源保持连接,直到程序结束,这种方式的实时性好,但独占数据库连接,在数据量小和只读的情况下优先选择这种模式。 断开模式是指客户端从数据源获取数据后断开与数据源的连接,所有的数据操作都是针对本地数据缓存里的数据,当需要从数据源获取新数据或者被处理后的数据回传时客户端再与数据源连接完成相应的操作。这种方式不独占数据库连接,但实时性差。断开模式适用于数据量大、需要修改数据同时更新数据库的场合。 5.4使用ADO.NET技术操作数据 5.4.1数据的添加 1. 数据添加概述 数据添加是程序开发过程中最基本的工作。如果采用把数据绑定到控件的方式,则需要设置每个控件的相关属性,灵活性会受到限制。如果使用ADO.NET对象就方便多了。在添加数据的过程中首先创建SqlConnection对象和SqlCommand对象,然后打开数据库连接,并调用SqlCommand对象的ExecuteNonQuery()方法完成插入操作。 2. 应用举例 【案例5.5】添加单条数据。 在页面中输入邮件信息,单击“添加”按钮把该条信息添加到test数据库的send表中。 1) 新建一个空网站 方法略。 2) 新建网页Default.aspx 设置网页标题为“添加单条数据”。在页面中添加一个6行2列的表格用来布局,把表格的第1行、第5行和第6行的单元格合并,在第2行和第3行的第2列中各添加一个TextBox控件,在第5行中添加两个Button控件,在第6行中添加一个GridView控件,所有控件的ID均采用默认名称。 设置GridView1控件的AutoGenerateColumns为false,单击GridView1控件右上方的智能标记按钮,在弹出的“GridView任务”菜单中选择“编辑列”选项,在打开的“字段”对话框中给GridView1控件绑定send表中的3个字段,并把3个字段的列名称都改成中文,页面设计视图如图5.11所示。 图5.11案例5.5的设计视图 3) 编写程序代码 添加命名空间的引用,代码如下。 using System.Data; using System.Data.SqlClient; 在所有事件之外定义数据库连接对象,代码如下。 static string constr="Server=.;Database=test;Integrated Security=true"; SqlConnection conn=new SqlConnection(constr); 在页面载入时先创建SqlDataAdapter对象,再创建DataSet对象ds,把SqlDataAdapter对象中的数据填充到ds中,然后把ds绑定到GridView控件上显示出来。 Page_Load事件的代码如下。 protected void Page_Load(object sender, EventArgs e) { conn.Open(); SqlDataAdapter ada=new SqlDataAdapter("select*from send", conn); DataSet ds=new DataSet(); ada.Fill(ds); conn.Close(); GridView1.DataSource=ds; GridView1.DataBind(); } “添加”按钮被单击时执行的事件代码如下。 protected void Button1_Click(object sender, EventArgs e) { try { conn.Open(); string InsertSql="insert into send values('"+TextBox1.Text+"','"+TextBox2.Text+"', '"+TextBox3.Text+"')"; SqlCommand comm=new SqlCommand(InsertSql, conn); comm.ExecuteNonQuery(); SqlDataAdapter ada=new SqlDataAdapter("select*from send", conn); DataSet ds=new DataSet(); ada.Fill(ds); conn.Close(); GridView1.DataSource=ds; GridView1.DataBind(); Response.Write(""); } catch { Response.Write(""); } } 说明: try语句块打开数据库连接,创建SqlCommand对象,调用SqlCommand对象的ExecuteNonQuery()方法完成插入操作; 然后创建SqlDataAdapter对象和DataSet对象,调用SqlDataAdapter的Fill()方法填充DataSet,使用GridView控件把数据显示出来。catch语句块用来捕获异常,一旦操作失败,则抛出异常,提示“数据添加失败!”。 “重置”按钮被单击时执行的事件代码如下。 protected void Button2_Click(object sender, EventArgs e) { TextBox1.Text=""; TextBox2.Text=""; TextBox3.Text=""; } 4) 运行页面 按Ctrl+F5组合键运行页面,运行效果如图5.12所示。 图5.12添加单条数据 5.4.2数据的更新 1. 更新指定的数据 在开发网站的过程中,更新指定的数据是常见的操作,可利用update语句改变选定行上一列或多列的值。 【案例5.6】更新指定的数据。 在页面的表格中选定一行数据,更新其中的一列或多列的值。 1) 新建一个空网站 方法略。 2) 新建网页Default.aspx 设置网页标题为“更新指定的数据”。在页面中添加一个6行2列的表格用来布局,把表格的第1行、第2行和第6行的单元格合并,在第2行中添加一个GridView控件,在第3行至第5行的第2列中各添加一个TextBox控件,在第6行中添加一个Button控件,所有控件的ID均采用默认名称。 设置GridView1控件的AutoGenerateColumns为false。单击GridView1控件右上方的智能标记按钮,在弹出的“GridView任务”菜单中选择“编辑列”选项,在打开的“字段”对话框中给GridView1控件绑定shopping表中的4个字段,并把4个字段的列名称都改成中文; 接着在“字段”对话框中添加一个HyperLinkField字段,其属性设置代码如下。 在上面的代码中,DataNavigateUrlFields是指绑定到超链接的NavigateUrl属性的字段,DataNavigateUrlFormatString是指绑定到超链接的NavigateUrl属性的值应用的格式设置。页面设计视图如图5.13所示。 图5.13案例5.6的设计视图 3) 编写程序代码 添加命名空间的引用,代码如下。 using System.Data; using System.Data.SqlClient; 在所有事件之外定义数据库连接对象,代码如下。 static string constr="Server=.;Database=test;Integrated Security=true"; SqlConnection conn=new SqlConnection(constr); 编写绑定GridView控件的自定义方法,代码如下。 public void GridViewBind() { conn.Open(); SqlDataAdapter ada=new SqlDataAdapter("select*from shopping", conn); DataSet ds=new DataSet(); ada.Fill(ds); GridView1.DataSource=ds; GridView1.DataBind(); conn.Close(); } 在页面载入时先把shopping表绑定到GridView1控件上显示出来,然后把选定行的3个字段值显示在对应的文本框控件中。Page_Load事件的代码如下。 protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { GridViewBind(); if (Request.QueryString["number"] !=null) { conn.Open(); SqlDataAdapter ada=new SqlDataAdapter("select*from shopping where number="+ Request.QueryString["number"]+"", conn); DataSet ds=new DataSet(); ada.Fill(ds, "shopping"); conn.Close(); DataRowView drv=ds.Tables["shopping"].DefaultView[0]; this.TextBox1.Text=drv["name"].ToString(); this.TextBox2.Text=drv["count"].ToString(); this.TextBox3.Text=drv["price"].ToString(); } } } “更新”按钮被单击时执行的事件代码如下。 protected void Button1_Click(object sender, EventArgs e) { try { conn.Open(); string sqltext="update shopping set name='"+this.TextBox1.Text+"',count= '"+this.TextBox2.Text+"',price='"+this.TextBox3.Text+"' where number="+Request["number"]; SqlCommand comm=new SqlCommand(sqltext, conn); comm.ExecuteNonQuery(); conn.Close(); GridViewBind(); Response.Write(""); } catch { Response.Write(""); } } 4) 运行页面 按Ctrl+F5组合键运行页面,单击商品编号17003一行中的“更新”超链接,在“商品数量”文本框中把牙刷的数量由50更新为80,运行效果如图5.14所示。 图5.14数据更新之前的效果 单击“更新”按钮,则GridView1控件中牙刷的数量由50更新成了80,运行效果如图5.15所示。 图5.15更新指定的数据 2. 批量更新数据 数据的批量更新是程序开发中经常用到的技术,它可以极大地提高用户的工作效率。在update语句中加入where条件可以实现批量更新数据的功能。 【案例5.7】批量更新数据。 根据选择的职称对具有相同职称的职工的工资做统一调整。 1) 新建一个空网站 方法略。 2) 新建网页Default.aspx 设置网页标题为“批量更新数据”。在页面中添加一个3行1列的表格用来布局,在第2行中添加一个GridView控件,在第3行中添加一个DropDownList控件、一个TextBox控件、一个Button控件,所有控件的ID均采用默认名称。 设置GridView1控件的AutoGenerateColumns为false。单击GridView1控件右上方的智能标记按钮,在弹出的“GridView任务”菜单中选择“编辑列”选项,在打开的“字段”对话框中给GridView1控件绑定staff表中的5个字段,并把5个字段的列名称都改成中文。给DropDownList控件增加教授、副教授、讲师、助教列表项。页面设计视图如图5.16所示。 图5.16案例5.7的设计视图 3) 编写程序代码 添加命名空间的引用,代码如下。 using System.Data; using System.Data.SqlClient; 在所有事件之外定义数据库连接对象,代码如下。 static string constr="Server=.;Database=test;Integrated Security=true"; SqlConnection conn=new SqlConnection(constr); 在页面载入时把staff表绑定到GridView1控件上显示出来,Page_Load事件的代码如下。 protected void Page_Load(object sender, EventArgs e) { conn.Open(); SqlDataAdapter ada=new SqlDataAdapter("select*from staff", conn); DataSet ds=new DataSet(); ada.Fill(ds); GridView1.DataSource=ds; GridView1.DataBind(); conn.Close(); } “确定更新”按钮被单击时执行的事件代码如下。 protected void Button1_Click(object sender, EventArgs e) { conn.Open(); string sqltext="update staff set Salary=Salary+"+TextBox1.Text+" where Title='"+ this.DropDownList1.SelectedItem.Text+"'"; SqlCommand comm=new SqlCommand(sqltext, conn); comm.ExecuteNonQuery(); SqlDataAdapter ada=new SqlDataAdapter("select*from staff", conn); DataSet ds=new DataSet(); ada.Fill(ds); GridView1.DataSource=ds; GridView1.DataBind(); } 4) 运行页面 按Ctrl+F5组合键运行页面,在“将职称为”列表中选择“副教授”选项,在文本框中输入拟增加的工资值,运行效果如图5.17所示。 单击“确定更新”按钮,则每名职称为副教授的职工的工资都增加了100元,运行效果如图5.18所示。 图5.17批量更新之前的效果 图5.18批量更新之后的效果 5.4.3数据的删除 1. 删除指定的数据 如果数据信息中存在错误或者重复的数据,可以选定该数据,然后将其删除。 【案例5.8】删除指定的数据。 在页面中选定test数据库的staff表中的一行数据删除。 1) 新建一个空网站 方法略。 2) 新建网页Default.aspx 设置网页标题为“删除指定的数据”。在页面中添加一个2行1列的表格用来布局,在第2行中添加一个GridView控件, ID采用默认名称。 把GridView1控件的AutoGenerateColumns设置为false、DataKeyNames属性设置为主键Number。单击GridView1控件右上方的智能标记按钮,在弹出的“GridView任务”菜单中选择“编辑列”,在打开的“字段”对话框中给GridView1控件绑定staff表中的5个字段,并把5个字段的列名称都改成中文; 接着在“字段”对话框中添加一个CommandField字段,设置其ShowDeleteButton属性为true,在GridView中显示“删除”超链接,代码如下。 页面设计视图如图5.19所示。 图5.19案例5.8的设计视图 3) 编写程序代码 添加命名空间的引用,代码如下。 using System.Data; using System.Data.SqlClient; 在所有事件之外定义数据库连接对象,代码如下。 static string constr="Server=.;Database=test;Integrated Security=true"; SqlConnection conn=new SqlConnection(constr); 在页面载入时把staff表绑定到GridView1控件上显示出来,Page_Load事件的代码如下。 protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { conn.Open(); SqlDataAdapter ada=new SqlDataAdapter("select*from staff", conn); DataSet ds=new DataSet(); ada.Fill(ds); GridView1.DataSource=ds; GridView1.DataBind(); conn.Close(); } } 在GridView1中单击要删除数据所在行的“删除”超链接,激发GridView1的RowDeleting事件实现数据的删除,代码如下。 protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) { conn.Open(); string sqltext="Delete from staff where Number='"+ GridView1.DataKeys[e.RowIndex].Value+"'"; SqlCommand com=new SqlCommand(sqltext, conn); com.ExecuteNonQuery(); SqlDataAdapter ada=new SqlDataAdapter("select*from staff", conn); DataSet ds=new DataSet(); ada.Fill(ds); conn.Close(); GridView1.DataSource=ds; GridView1.DataBind(); } 4) 运行页面 按Ctrl+F5组合键运行页面,删除之前的效果如图5.20所示。 在表中单击最后一行数据所在行的“删除”超链接,执行RowDeleting事件后实现了这行数据的删除,效果如图5.21所示。 图5.20删除之前的效果 图5.21删除之后的效果 2. 批量删除数据 批量删除数据在网站及管理系统中的应用比较广泛,主要通过设置delete语句后的where条件来实现。 【案例5.9】批量删除数据。 在页面的下拉列表中选定一个职称,单击“删除”按钮删除该职称的所有职工数据。 1) 新建一个空网站 方法略。 2) 新建网页Default.aspx 设置网页标题为“批量删除数据”。在页面中添加一个3行1列的表格用来布局,在第2行中添加一个GridView控件,在第3行中添加一个DropDownList控件和一个Button控件,所有控件的ID均采用默认名称。 设置GridView1控件的AutoGenerateColumns为false。单击GridView1控件右上方的智能标记按钮,在弹出的“GridView任务”菜单中选择“编辑列”选项,在打开的“字段”对话框中给GridView1控件绑定staff表中的5个字段,并把5个字段的列名称都改成中文。给DropDownList控件增加教授、副教授、讲师、助教列表项。页面设计视图如图5.22所示。 图5.22案例5.9的设计视图 3) 编写程序代码 添加命名空间的引用,代码如下。 using System.Data; using System.Data.SqlClient; 在所有事件之外定义数据库连接对象,代码如下。 static string constr="Server=.;Database=test;Integrated Security=true"; SqlConnection conn=new SqlConnection(constr); 在页面载入时把staff表绑定到GridView1控件上显示出来,Page_Load事件的代码如下。 protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { conn.Open(); SqlDataAdapter ada=new SqlDataAdapter("select*from staff", conn); DataSet ds=new DataSet(); ada.Fill(ds); conn.Close(); GridView1.DataSource=ds; GridView1.DataBind(); } } “删除”按钮被单击时执行的事件代码如下。 protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) { conn.Open(); string sqltext="delete from staff where Title='"+this.DropDownList1.SelectedItem.Text+"'"; SqlCommand comm=new SqlCommand(sqltext, conn); comm.ExecuteNonQuery(); SqlDataAdapter ada=new SqlDataAdapter("select*from staff", conn); DataSet ds=new DataSet(); ada.Fill(ds); conn.Close(); GridView1.DataSource=ds; GridView1.DataBind(); } 4) 运行页面 按Ctrl+F5组合键运行页面,批量删除之前的运行效果如图5.23所示。 选择“助教”选项,单击“删除”按钮后所有职称为“助教”的职工数据被删除了,运行效果如图5.24所示。 图5.23批量删除之前的效果 图5.24批量删除之后的效果 5.4.4存取图片 1. 将上传图片存储到数据库中 在开发Web应用程序的过程中经常会用到图片上传功能,使用户可以将上传的图片名称存储到指定的表中,将图片存储到指定的目录下。 【案例5.10】将上传图片存储到数据库中。 首先获取上传控件指定的图片名称,然后获取文件扩展名并判断其格式是否符合图片类型,最后通过SQL语句将图片的名称插入数据库test的picSend表中,并把图片保存到指定文件夹下。 1) 新建一个空网站 方法略。 2) 新建网页Default.aspx 设置网页标题为“将上传图片存储到数据库中”。在页面中添加一个5行2列的表格用来布局,将第1行、第4行、第5行合并,在第2行的第2列中添加一个TextBox控件,在第3行的第2列中添加一个FileUpload控件,在第4行中添加一个Button控件,在第5行中添加一个GridView控件,所有控件的ID均采用默认名称。 图5.25案例5.10的设计视图 设置GridView1控件的AutoGenerateColumns为false。单击GridView1控件右上方的智能标记按钮,在弹出的“GridView任务”菜单中选择“编辑列”选项,在打开的“字段”对话框中给GridView1控件绑定picSend表中的4个字段,并把4个字段的列名称都改成中文。页面设计视图如图5.25所示。 3) 编写程序代码 在前面的案例中,数据库的连接字符串都放在Web窗体文件的后台代码中,这种方式不便于多个窗体页面共享数据库连接字符串。当连接字符串发生改变时需要修改所有页面。ASP.NET提供了System.Configuration命名空间,其中的Configuration类用于管理网站配置文件,将数据库的连接字符串存放到Web.config中可以实现多个窗体共享数据库的连接字符串。通常将连接字符串放在Web.config的下的配置节中。 本案例中在Web.config文件的节中加入以下代码。 添加命名空间的引用,代码如下。 using System.Configuration; using System.Data; using System.Data.SqlClient; 在所有事件之外定义数据库连接对象,其中连接SQL Server数据库的字符串是从节点中读取的,代码如下。 SqlConnection conn= new SqlConnection(ConfigurationManager.ConnectionStrings["constr"].ConnectionString); 定义gvBind()方法使上传图片表中的内容在GridView控件中显示,代码如下。 protected void gvBind() { conn.Open(); string sqltext="select*from picSend"; SqlDataAdapter sda=new SqlDataAdapter(sqltext, conn); DataSet ds=new DataSet(); sda.Fill(ds); conn.Close(); GridView1.DataSource=ds.Tables[0].DefaultView; GridView1.DataBind(); } 页面加载时调用gvBind()方法显示上传图片表,代码如下。 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { gvBind(); } } 单击“上传”按钮后首先获取上传图片文件名,再获取上传文件的扩展名,通过if语句判断图片格式是否符合要求,如果符合,则通过insert语句将文件名存储到数据库中,并通过SaveAs方法将图片保存到指定目录下; 如果图片格式不符合要求,则弹出“图片格式不正确!”的提示框。“上传”按钮的单击事件代码如下。 protected void Button1_Click(object sender, EventArgs e) { string Name=TextBox1.Text; string pictureName=FileUpload1.FileName; string sendTime=DateTime.Now.ToString(); string lastName=pictureName.Substring(pictureName.LastIndexOf(".")+1); if (lastName.ToLower()=="jpg" || lastName.ToLower()=="bmp"||lastName.ToLower()=="gif") { string SavePath=Server.MapPath("images/")+pictureName; FileUpload1.PostedFile.SaveAs(SavePath); string sql="insert into picSend(name,picname,sendtime) values('"+Name+"', '"+pictureName+"','"+sendTime+"')"; conn.Open(); SqlCommand com=new SqlCommand(sql, conn); com.ExecuteNonQuery(); conn.Close(); gvBind(); } else Response.Write(""); } 图5.26将上传图片存储到数据库 中的运行效果 4) 运行页面 按Ctrl+F5组合键运行页面,在“用户名:”文本框中输入用户名,通过单击“选择文件”按钮选择要上传的图片文件,单击“上传”按钮。如果文件格式符合要求,则这个上传的图片文件的相关信息就显示在页面下方的GridView控件中。页面的运行效果如图5.26所示。 2. 读取图片名称并显示图片 在将上传的图片存储到数据库之后,有时需要在数据库中读取图片的名称并显示图片。 【案例5.11】读取图片名称并显示图片。 把数据库test的picSend表中的图片名称绑定到下拉列表中,选择下拉列表中的图片名称,在文本框中显示该图片的名称,并将图片显示在页面中。 1) 新建一个空网站 方法略。 2) 新建网页Default.aspx 设置网页标题为“读取图片名称并显示图片”。在页面中添加一个4行2列的表格用来布局,将第1行和第4行合并,在第2行的第2列中添加一个DropDownList控件,在第3行的第2列中添加一个Label控件,在第4行中添加一个Image控件,所有控件的ID均采用默认名称。设置DropDownList控件的AutoPostBack属性为true。 3) 编写程序代码 在Web.config文件的节中加入以下代码。 添加命名空间的引用,代码如下。 using System.Configuration; using System.Data; using System.Data.SqlClient; 在所有事件之外定义数据库连接对象,其中连接SQL Server数据库的字符串是从节中读取的,代码如下。 SqlConnection conn= new SqlConnection(ConfigurationManager.ConnectionStrings["constr"].ConnectionString); 定义ddlBind()方法把保存在数据表中的图片名称绑定到DropDownList控件中,将控件文本内容设置为数据表picSend中的picname字段,ddlBind()方法的代码如下。 protected void ddlBind() { string sql="select picname from picSend"; conn.Open(); SqlDataAdapter sda=new SqlDataAdapter(sql, conn); DataSet ds=new DataSet(); sda.Fill(ds); DropDownList1.DataSource=ds.Tables[0].DefaultView; DropDownList1.DataTextField="picname"; DropDownList1.DataValueField="picname"; DropDownList1.DataBind(); } 定义imgBind()方法将当前选择的图片显示在Image控件中,代码如下。 protected void imgBind() { Image1.ImageUrl="~/images/"+DropDownList1.SelectedValue; } 在页面加载时,调用ddlBind()方法将图片名称添加到下拉列表控件DropDownList中,调用imgBind()方法在Image控件中显示当前选定的图片,把下拉列表中当前选定的图片名称读到文本框中,Page_Load事件的代码如下。 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { ddlBind(); imgBind(); Label1.Text=this.DropDownList1.SelectedItem.Text; } } 当改变DropDownList选项时,会激发SelectedIndexChanged事件,在该事件中调用imgBind()方法重新显示图片,并把重新选择的图片名称读取到文本框中。DropDownList控件的SelectedIndexChanged事件的代码如下。 protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { Label1.Text=this.DropDownList1.SelectedItem.Text; imgBind(); } 4) 运行页面 按Ctrl+F5组合键运行页面,在下拉列表中选择图片名称,则在Image控件中会显示该图片,并把其名称读取到文本框中,页面的运行效果如图5.27所示。 图5.27读取图片名称并显示图片 习题5 1. 填空题 (1) .NET框架中被用来访问数据库数据的组件集合称为。 (2) 使用DataSet类定义数据集对象必须添加对命名空间的引用。 (3) Connection对象的数据库连接字符串保存在属性中。 (4) ExecuteScalar()方法能够执行查询,并返回查询所返回的结果集中第行的第列。 (5) 某Command对象cmd将被用来执行以下SQL语句以向数据源中插入新记录: insert into customs(1000,"tom") 则语句“cmd.ExecuteNonQuery();”的返回值可能为或。 (6) DataTable是数据集myDataSet中的数据表对象,假设有9条记录,在调用下列代码后DataTable中还有条记录。 dataTable.Rows[8].Delete(); (7) 在使用DataAdapter对象时只需分别设置表示SQL命令和数据库连接的两个参数,就可以通过它的方法把查询结果放在一个对象中。 (8) 如果要创建一个DataReader对象,可以通过Command对象的方法。 (9) 用户可以首先使用构造函数创建一个不含参数的DataAdapter对象,再设置DataAdapter对象的属性和属性。 (10) 每一个DataSet都是一个或多个对象的集合。 2. 单项选择题 (1) DataAdapter对象使用与属性关联的Command对象将DataSet修改的数据保存到数据源。 A. SelectCommandB. InsertCommand C. UpdateCommandD. DeleteCommand (2) 在ADO.NET中,为了确保DataAdapter对象能够正确地将数据从数据源填充到DataSet中,必须事先设置好DataAdapter对象的属性。 A. DeleteCommandB. UpdateCommand C. InsertCommandD. SelectCommand (3) ADO.NET可以通过设置Connection对象的属性来指定连接到数据库时的用户和密码信息。 A. ConnectionStringB. DataSource C. UserInformationD. Provider (4) 打开与SQL Server数据库连接的方法是。 A. Close()B. Open()C. Read()D. Fill() (5) SqlCommand类可以用来实现。 A. 使用SQL语句操作数据B. 打开数据库的连接 C. 填充数据到内存表D. 关闭数据库的连接 (6) SQL Server的Windows身份验证机制是指当网络用户尝试连接到SQL Server数据库时。 A. Windows获取用户输入的用户名和密码,提交给SQL Server进行身份验证,并决定用户的数据库访问权限 B. SQL Server将用户输入的用户名和密码提交给Windows进行身份验证,并决定用户的数据库访问权限 C. SQL Server根据已在Windows网络中登录的用户的网络安全属性对用户身份进行验证,并决定用户的数据库访问权限 D. 登录到本地Windows的用户均可无限制地访问SQL Server数据库 (7) 在ADO.NET中,为了访问DataTable对象从数据源提取的数据行,可以使用DataTable对象的属性。 A. RowsB. ColumnsC. ConstraintsD. DataSet (8) 下列不能在DataSet对象ds中添加一个名为Customers的DataTable对象。 A. DataTable dt_customers=new DataTable(); B. DataTable dt_customers=new DataTable("Customers"); C. ds.Tables.Add("Customers"); D. ds.Tables.Add(new DataTable("Customers")); (9) Command对象的方法在执行数据更新操作时使用。 A. ExecuteNonQuery()B. ExecuteReader() C. ExecuteScalar()D. Execute() (10) 实现独立于任何数据源的数据访问,可以把它看成内存中的数据库,专门用来处理从数据源中读出的数据。 A. DataGroupB. DataSetC. ADOD. Datanet 3. 上机操作题 (1) 已知SQL Server数据库为XSDB,其中有一张表为student,表中有3个字段,即学号、姓名、性别。设计一个页面,在文本框控件TextBox中输入学号查询学生信息,如果查找到,则在标签控件Label中显示“查找到的信息如下:”,并将该学生的各项信息分别显示在对应的TextBox控件中; 如果查找不到,则在Label中显示“查无此人!”。 (2) 有一个数据库hh,其中的student表中有字段信息(学号nvarchar(12),姓名nvarchar(10),性别nvarchar(2))。现在页面上有TextBox控件TID、TName、TSex (用来分别显示表中的3个字段)和一个按钮控件btnSubmit。请编程实现单击btnSubmit控件后将文本框中对应的值插入到student数据表中。 (3) 有一个数据库dd,其中的ks表中有字段信息(考号nvarchar(10),姓名nvarchar(10),成绩int)。设计一个页面,在文本框控件TextBox中输入要删除的考号,单击“删除”按钮后从数据表ks中删除该条记录。