ADO.NET(在连接环境中获取数据)陈皓月体验SQL•指定应用程序所需要访问的数据•返回所访问到的数据在同数据源之间建立连接之后,应用程序和数据源之间的交流就包括以下两个方面。SQL(续)•Command对象:包含要对数据库执行的SQL命令•DataReader对象:根据Command对象的查询结果,按顺序获取单行数据ADO.NET提供两个对象,二者相互配合来实现应用程序和数据源之间的交流。Command对象的属性Command对象的属性及其描述如下表所示。属性描述CommandText要对数据源执行的SQL语句或存储过程CommandTimeout在终止执行命令的尝试并生成错误提示信息之前的等待时间(单位:秒)CommandType指示如何解释CommandText属性,默认值是TextConnectionCommand对象所要使用的ConnectionParametersParameters集合Transaction执行命令所在的事务(将在第7章中详细阐述)UpdatedRowSource确定当Command对象被DataAdapter或TableAdapter的Update()方法使用时,其结果如何应用于DataRowCommandType属性(续)CommandType属性用来指示如何解释CommandText属性的内容。其取值及描述如下表所示。属性值描述StoredProcedure指示CommandText属性所包含的是要执行的存储过程的名称TableDirect指示CommandText属性所包含的是要访问的一个表的名称,从此表中将取出所有的列和行Text指示CommandText属性包含的是要执行的SQL命令(此为默认值)UpdateRowSource属性UpdateRowSource属性的值及其描述如下。属性值描述Both将Command对象的输出参数和第一个返回行都映射至已更改的行FirstReturnedRecord将第一个返回行中的数据映射至已更改的行None忽略所返回的任何参数或行OutputParameters仅将Command对象的输出参数映射到已更改的行设置Command对象的属性(续)Command对象的大多数属性是通过简单的赋值语句来设置的,不过Parameters集合是一个例外,它所使用的是Add()方法。在下一节中将详细讨论Parameters集合。代码示例C#代码示例VBCommand对象的参数要在Command对象中使用参数,通常有以下三个步骤。在命令文本或存储过程中指定参数。1将参数添加至Command对象的Parameters集合中。2设置参数值。3Command对象的参数(续)Parameters集合提供了一系列方法对集合进行配置。方法描述Add()将参数添加到集合中Clear()从集合中移除所有参数Insert()将参数插入集合中的指定索引位置Remove()从集合中移除所指定的参数添加并配置参数创建新的SqlParameter对象或OleDbParameter对象。1通过编程方式将参数添加至Command对象的Parameters集合中,需遵循以下步骤。配置参数对象的属性。2调用Command对象Parameters集合的Add()方法,将参数添加至Command对象的Parameters集合中。3添加并配置参数(续)参数对象的属性及其描述如下表所示。属性描述ParameterName将该属性设置为SQL命令或存储过程中的参数名,如“@EmployeeID”DbType、SqlDbType或OleDbType将该属性设置为参数的数据类型。设置SqlParameter对象的数据类型的方法有以下两种。在DbType枚举中选择一个值赋给DbType属性在SqlDbType枚举中选择一个值赋给SqlDbType属性Size设置该属性以指示参数大小,例如字符串参数中字符的个数。无需为已知且具有固定大小的数据类型(例如DbType.Int32)指定大小Direction设置该属性以指示该参数是只输入参数、只输出参数、双向参数还是存储过程的返回值。该属性可设置为ParameterDirection枚举值之一:ParameterDirection.Input、ParameterDirection.InputOutput、ParameterDirection.Output或ParameterDirection.ReturnValue。默认方向为ParameterDirection.InputValue对于只输入参数或双向参数而言,在运行该命令之前需要设置Value属性。对于只输出参数、双向参数和存储过程的返回值而言,在运行该命令之后可以检索Value属性设置Parameters的值在设置好Parameters集合、执行Command之前,必须为每一个Parameter设置它们的值。可以在“SqlParameter集合编辑器”中进行设置。使用Command对象来执行SQL语句创建Command对象后,就可以对数据库执行命令。方法描述Cancel()取消命令的执行CreateParameter()创建SqlParameter对象的新实例ExecuteScalar()执行命令并返回查询结果集中第一行的第一列。忽略额外的列或行ExecuteNonQuery()执行命令并返回受影响的行数ExecuteReader()执行命令并返回一个DataReader对象ExecuteXmlReader()执行命令并生成一个XmlReader对象Prepare()在SQLServer的实例上创建命令的一个准备(预编译)版本ResetCommandTimeout()将CommandTimeout属性重置为其默认值SqlCommand和OleDbCommand类提供了相关的一些方法来执行命令,其中最重要的有以下四种方法:ExecuteScalar()方法ExecuteNonQuery()方法ExecuteReader()方法ExecuteXMLReader()方法使用Command对象来执行SQL语句(续)ExecuteScalar()方法1.打开一个数据库连接。2.创建并初始化一个Command对象。3.对该Command对象调用ExecuteScalar()方法。4.将从ExecuteScalar()返回的值转换为适当的数据类型。5.释放该Command对象。6.关闭该数据库连接。执行返回标量结果的查询的步骤如下。ExecuteNonQuery()方法的返回值是SQL命令或存储过程所影响的行数。DataReader对象及ExecuteReader()方法打开一个数据库连接。1要创建DataReader对象,就需要执行Command类的ExecuteReader()方法。具体步骤如下。创建并初始化一个Command对象。2对该Command对象调用ExecuteReader()方法。3将ExecuteReader()方法的返回值赋给一个DataReader对象。4编写循环语句以对该DataReader对象调用Read()方法,并且每一次从其结果集中读取一行。5每循环一次,即获取希望在当前行中处理的列的值。6DataReader对象及ExecuteReader()方法(续)如果查询命令返回多重结果集,则对该DataReader对象调用NextResult()方法。7执行完循环之后,释放或关闭该DataReader对象。8释放该Command对象。9关闭该数据库连接。10代码示例C#代码示例VBDataReader对象及ExecuteReader()方法(续)使用Command对象进行异步操作原本ADO.NET的Command对象执行SQL命令的方法有ExecuteReader()、ExecuteNonQuery()、ExecuteXmlReader()以及ExecuteScalar()等,在ADO.NET2.0中,除了ExecuteScalar()方法外,其余的方法都新增了以Begin和End关键字所嵌入的一对方法。代码示例C#代码示例VB使用Command对象查询多个活动结果集在默认情况下,在通往启用MARS的主机(例如MicrosoftSQLServer2005)的连接上,MARS是活动的。依赖于MARS技术的编码更为简单易读,并且使编程人员在开发数据集中的Web应用程序时可以减少对内存的使用,在一定程序上消除了性能瓶颈。使用Command对象查询多重活动结果集(续)创建一个如上所示的连接字符串。1请遵循以下步骤来建立MARS。创建一个SqlConnection对象,并使用该连接字符串对其进行初始化。2使用Open()方法打开这个SqlConnection对象。3对于所要执行的查询,创建一个新的SqlCommand对象。4使用适当的命令(如果想读取该查询结果,可以使用ExecuteReader()方法)。5完成后,关闭SqlConnection对象。6使用Command对象查询多重活动结果集(续)习题1.假设正在创建一个Windows窗体应用程序。该应用程序使用名为cmd的SqlCommand对象,该cmd对象执行以下存储过程。CREATEPROCEDUREGetPhoneListASBEGINSELECTCompanyName,PhoneFROMCustomersSELECTCompanyName,PhoneFROMSuppliersEND需要将所有返回的行添加至名为lstPhones的ListBox控件,应该使用代码段_____。习题(续)A.SqlDataReaderrdr=cmd.ExecuteReader();do{while(rdr.Read()){lstPhones.Items.Add(rdr.GetString(0)+\t+rdr.GetString(1));}}while(rdr.NextResult());B.SqlDataReaderrdr=cmd.ExecuteReader();while(rdr.Read()){lstPhones.Items.Add(rdr.GetString(0)+\t+rdr.GetString(1));}习题(续)C.SqlDataReaderrdr=cmd.ExecuteReader();while(rdr.NextResult()){while(rdr.Read()){lstPhones.Items.Add(rdr.GetString(0)+\t+rdr.GetString(1));}}D.SqlDataReaderrdr=cmd.ExecuteReader();while(rdr.NextResult()){lstPhones.Items.Add(rdr.GetString(0)+\t+rdr.GetString(1));}习题(续)2.请描述MyCommand的ExecuteNonQuery()、ExecuteScalar()、ExecuteReader()方法之间的区别。习题(续)3.创建一个显示GridView的Web窗体。GridView的数据源是名为dsOrders的数据集。该数据集包含名为Orders和OrderDetails的两个数据表。将Orders表的OrderID设置为int,将OrderDetails表的OrderID设置为decimal,使用以下代码段创建这两个数据表之间的关系。(行号仅供参考。)01dtOrders=dsOrders.Tables[Orders];02dtOrderDetails=dsOrders.Tables[OrderDetails];03colParent=dtOrders.Columns[OrderID];04colChild=dtOrderDetails.Columns[ParentOrderID];05dsOrders.Relations.Add(Rel1,colParent,col