-
1 任务二 使用C...
-
2 补充知识
使用Command执行数据库命令
【任务要点】
Command对象及使用
【案例一】制作显示商品分类列表的页面
制作一个Web窗体,在窗体中显示所有商品分类的名称。该页面显示数据使用了Command对象的DataReader方法。
实例运行结果如图2-1所示。

【具体步骤】
(1)在YiZeShopTest应用程序中添加Web窗体并命名为Command_DataReader.aspx。
(2)转到窗体的代码视图,添加引用using System.Data.SqlClient。
(3)在窗体的设计视图下双击页面空白处进入Page_Load()事件,在该事件中添加代码。


程序中使用Command对象的ExecuteReader方法查询SQL Server数据库。代码SqlCommand cmd = new SqlCommand(sqlStr,conn);使用了构造函数定义了Command对象实例,也可以使用如下方式书写:
SqlCommand cmd;
cmd=new SqlCommand(sqlStr,conn);
在代码中,SqlDataReader dr = cmd.ExecuteReader();语句表示定义一个SqlDataReader对象的实例,然后把Command对象执行的命令结果返回给对象变量dr。接着使用循环语句将查询到的数据输出显示到Web窗体上。最后释放资源关闭连接。
【案例二】制作简单用户登录页面
前面已经学习了如何将新用户添加到数据库中,很显然,下一步就是学习如何检索信息。在程序中,需要在登录页面上完成下述功能——有人来到站点并输入用户名和密码,此时需要识别该用户是否已经存在,以及他们提供的密码是否正确。
在项目中,构建了一个名为Login.aspx的Web窗体,如图2-2所示。

当提交登录页面的时候,会收到用户名和密码,此时需要检查这些值是否能够匹配数据库中的现有用户。而且需要从数据库中得到符合传入信息的用户ID,以便使用这个ID值来为当前用户检索不同的信息事项。
一旦得到了有效的用户ID,需要告知ASP.NET用户已通过验证,可以让他们看到最初请求的页面。
在该例中,将把刚才讨论的内容运用到代码中,在登录按钮的处理程序中,将使用ExecuteScalar()方法来检索给定登录名和密码的用户ID值。运行后的效果如图2-3所示。

【具体步骤】
(1)打开Login.aspx页面,双击【登录】按钮转向后台编码页面。
(2)在页面的顶部位置添加命名空间using System.Data.SqlClient;的引用。
(3)在后台编码页登录按钮事件中,写入以下代码:

将Login.aspx设为起始页,启动项目。输入用户名和密码后,单击登录按钮,将执行按钮的Click事件。
一旦用户在这里完成了身份验证,就可以通过Session["user"]在任何后台编码页中访问他们的用户ID了。



【背景知识】
Command对象及使用
Command对象提供对数据源执行SQL命令的接口,可以用来对数据库发出一些指令。利用Command对象可调用SQL命令来返回数据、修改数据、运行存储过程,以及发送或者检索参数信息。这个对象架构在Connection对象上,即Command对象是通过连接到数据源的Connection对象来下达命令的。所以Connection连接到哪个数据库,Command对象的命令就下达到哪里。
1.Command对象的常用属性
(1)Connection:该属性获取或设定Command对象对数据源的操作要通过哪个Connection对象,例如,如果想通过cn这个Connection对象对数据源进行数据操作,则可以将其Connection属性的值设置为cn,即cmd.Connection=cn(cmd为Command对象的一个实例)。
(2)CommandType:获取或设置CommandText属性中的内容是SQL语句、数据表名称还是存储过程的名称。CommandType可以设置为以下三个值之一。
①“CommandType.Text”(默认值):当把CommandType属性的值设定为“CommandType.Text”或不指定任何值时,CommandText属性的值为一个SQL字符串(既可以是一个简单的查询,又可以是插入、删除、更新数据的语句)
②“CommandType.TableDirect”:当把CommandType属性的值设定为“CommandType.TableDirect”时,应该把CommandText属性的值设为要访问的表的名称。
③“CommandType.StoredProcedure”:把CommandText属性的值设为存储过程的名称。
(3)CommandText:获取或设置在数据源中执行的SQL语句或存储过程。
(4)CommandTimeout:获取或设置超时时间。
2.Command对象的常用方法
(1)ExecuteNonQuery():可以执行例如Transact_SQL的Insert、Delete、Update命令以及Set命令,并返回受命令影响的行数。
(2)ExecuteReader():执行返回行的命令。
(3)ExecuteScalar():从数据库中检索单个值。
(4)ExecuteXmlReader():把CommandText发送给连接,构建一个XmlReader对象。
(5)Cancel():取消了Command命令的执行。
3.Command对象的创建是由其对应的构造函数构造完成的,但是,不同的数据提供者用不同的类及其构造函数完成Command对象的构建,在SQL Server数据提供者中用类SqlCommand的构造函数创建Command对象,而在OLE DB数据提供者中用类 OleDBCommand的构造函数创建Command对象。表2-1列出这两个类的4种构造函数的原型。

4.ExecuteNonQuery方法
Command对象的ExecuteNonQuery方法用来执行Insert、Update、Delete和其他没有返回值的SQL命令。当使用Insert、Update、Delete等SQL命令时,ExecuteNonQuery方法返回被命令影响的行数,对其他SQL命令执行的操作,ExecuteNonQuery方法返回-1。当Update和Delete命令执行的目标记录不存在时,ExecuteNonQuery方法只是返回0,而不构成错误。

5.ExecuteScalar方法
Command对象的ExecuteScalar方法执行一个SQL命令并返回结果集的第一行的第一列,如果结果集多于一行一列,它将忽略其余部分。需要注意的是,ExecuteScalar方法的返回值是Object类型,所以在使用返回值之前需要进行必要的强制类型转换。如果对象类型不匹配,系统将生成运行错误。提示类型转换无效。

6.ExecuteReader方法
Command对象的ExecuteReader方法通过DataReader对象返回与SQL查询匹配的行。只要创建一个Connection对象,并为Command对象指定一个SQL查询,就可以调用Command对象的ExecuteReader方法,从数据源中检索数据。

Command对象的ExecuteReader方法两种原型,二者都可以返回一个DataReader对象:
(1)ExecuteReader();
(2)ExecuteReader(CommandBehavior behavior)。
结合两个实例去理解。

