5.1.1 使用 ExecuteReader()操作数据库 使用 ExecuteReader() 操 作数据 库, ExecuteReader() 方法返回 的是一个 SqlDataReader 对象或 OleDbDataReader 对象。当使用 DataReader 对象时,不会像 DataSet 那样提供无连接的数据库副本, DataReader 类被设计为产生只读、只进的数据流。这些数据流都是从数据库返回的。所以,每次的访问 或操作只有一个记录保存在服务器的内存中。 相比与 DataSet 而言,DataReader 具有较快的访问能力,并且能够使用较少的服务器资源。DataReader 对象提供了“游标”形式的读取方法,当从结果中读取了一行,则“游标”会继续读取到下一行。通过 Read 方法可以判断数据是否还有下一行,如果存在数据,则继续运行并返回 true,否则返回 false。示例 代码如下所示。 string str = "server='(local)';database='mytable';uid='sa';pwd='sa'"; SqlConnection con = new SqlConnection(str); con.Open(); string strsql = "select * from mynews"; SqlCommand cmd = new SqlCommand(strsql, con); SqlDataReader rd = cmd.ExecuteReader(); while (rd.Read()) { Response.Write(rd["title"].ToString()); } //打开连接 //SQL 查询语句 //初始化 Command 对象 //初始化 DataReader 对象 //通过索引获取列
5.1.1 使用 ExecuteReader()操作数据库 DataReader 可以提高执行效率,有两种方式可以提高代码的性能,一种是基于序号的查询;第二种 情况则是使用适当的 Get 方法来查询。一般来说,在数据库的设计中,需要设计索引键或主键来标识, 在主键的设计中,自动增长类型是经常使用的,自动增长类型通常为整型,所以基于序号的查询可以使 用 DataReader,示例代码如下所示。 string str = "server='(local)';database='mytable';uid='sa';pwd='sa'"; SqlConnection con = new SqlConnection(str); con.Open(); //设置连接字串 //创建连接对象 //打开连接 string strsql = "select * from mynews where id=1 order by id desc"; //按标识查询 SqlCommand cmd = new SqlCommand(strsql, con); SqlDataReader rd = cmd.ExecuteReader(); while (rd.Read()) { Response.Write(rd["title"].ToString()); } //创建 Command 对象 //创建 DataReader 对象 //遍历数据库 //读取相应行的信息
5.1.1 使用 ExecuteReader()操作数据库 当使用 ExecuteReader()操作数据库时,会遇到知道某列的名称而不知道某列的号的情况,这种情况 可以通过使用 DataReader 对象的 GetOrdinal()方法获取相应的列号。此方法接收一个列名并返回此列名 所在的列号,示例代码如下所示。 string str = "server='(local)';database='mytable';uid='sa';pwd='sa'"; //创建连接字串 SqlConnection con = new SqlConnection(str); //创建连接对象 con.Open(); //打开连接 string strsql = "select * from mynews where id=1 order by id desc"; //创建执行 SQL 语句 SqlCommand cmd = new SqlCommand(strsql, con); SqlDataReader rd = cmd.ExecuteReader(); int id = rd.GetOrdinal("title"); while (rd.Read()) { Label1.Text = "新闻 id 是" + rd["id"]; } //创建 Command 对象 //创建 DataReader 对象 //使用 GetOrdinal 方法获取 title 列的列号 //遍历 DataReader 对象 //输出对象的值
5.1.1 使用 ExecuteReader()操作数据库 当完成数据库操作时,需要关闭数据库连接,DataReader 对象在调用 Close()方法即关闭与数据库的 连接,如果在没有关闭之前又打开另一个连接,系统会抛出异常。示例代码如下所示。 rd.Close(); //关闭 DataReader 对象 ExecuteReader()可以执行相应的 SQL 语句,例如插入、更新以及删除等,当需要执行插入、更新或 删除时,可以使用 ExecuteReader()进行数据操作,示例代码如下所示。 string str = "server='(local)';database='mytable';uid='sa';pwd='sa'"; SqlConnection con = new SqlConnection(str); con.Open(); string strsql = "insert into mynews values ('执行更新后的标题')"; SqlCommand cmd = new SqlCommand(strsql, con); SqlDataReader rd = cmd.ExecuteReader(); while (rd.Read()) { Response.Write(rd["title"].ToString() + "<hr/>"); } rd.Close(); Response.Redirect("ExecuteReader.aspx"); //创建连接字串 //创建连接对象 //打开连接 //创建执行 SQL 语句 //创建 Command 对象 //使用 ExcuteReader()方法 //读取数据库 //关闭 DataReader 对象
5.1.1 使用 ExecuteReader()操作数据库 当执行了插入、删除等数据库操作时,ExecuteReader 返回为空的 DataReader 对象。当使用 Read 方 法遍历读取数据库时,并不会显示相应的数据信息,因为不是查询语句,则返回一个没有任何数据的System.Data.OleDb.OleDbDataReader 类型的集(EOF),但是 ExecuteReader 方法可以执行 SQL 语句。 如图所示。 使用 ExecuteReader()操作数据库,通常情况下是使用 ExecuteReader()进行数据库查询操作,使用 ExecuteReader()查询数据库能够提升查询效率,而如果需要进行数据库事务处理的话,ExecuteReader() 方法并不是理想的选择。
5.1.2 使用 ExecuteNonQuery()操作数据库 使用 ExecuteNonQuery()操作数据库时,ExecuteNonQuery()并不返回 DataReader 对象,返回的是一 个整型的值,代表执行某个 SQL 语句后,在数据库中影响的行数,示例代码如下所示。 string str = "server='(local)';database='mytable';uid='sa';pwd='sa'"; SqlConnection con = new SqlConnection(str); con.Open(); string strsql = "select top 5 * from mynews order by id desc"; SqlCommand cmd = new SqlCommand(strsql, con); Label1.Text="该操作影响了"+cmd.ExecuteNonQuery()+"行"; //创建连接字串 //创建连接对象 //打开连接 //使用 ExecuteNonQuery //执行 SQL 语句并返回行 上述代码使用了 SELECT 语句,并执行语句,返回受影响的行数。运行后,发现返回的结果为-1, 说明,当使用 SELECT 语句时,并没有对任何行有任何影响。ExecuteNonQuery()通常情况下为数据库事 务处理的首选,当需要执行插入、删除、更新等操作时,首选 ExecuteNonQuery()。
5.1.2 使用 ExecuteNonQuery()操作数据库 对于更新、插入和删除的 SQL 句,ExecuteNonQuery()方法的返回值为该命令所影响的行数。对于 “CREATE TABLE”和“DROP TABLE”语句,返回值为 0,而对于所有其他类型的语句,返回值为-1。 ExecuteNonQuery()操作数据时,可以不使用 DataSet 直接更改数据库中的数据,示例代码如下所示。 protected void Button1_Click(object sender, EventArgs e) { string str = "server='(local)';database='mytable';uid='sa';pwd='sa'"; SqlConnection con = new SqlConnection(str); con.Open(); string strsql = "delete from mynews where id>4"; SqlCommand cmd = new SqlCommand(strsql, con); Label1.Text = "该操作影响了" + cmd.ExecuteNonQuery() + "行"; } //创建连接字串 //创建连接对象 //打开连接 //编写执行删除的 SQL 语句 //创建 Command 对象 //返回影响行数
5.1.2 使用 ExecuteNonQuery()操作数据库 运行上述代码后,会执行删除id号大于4的数据事务,当执行删除并删除完毕后, 则ExecuteNonQuery()方法返回受影响的行数,如图所示。 注意:有些项目中,通过判断 ExecuteNonQuery()的返回值来判断 SQL 语句是否执行成功,这样是 有失偏颇的,因为当使用创建表的语句时,就算执行成功也会返回-1。 ExecuteNonQuery()操作主要进行数据库操作,包括更新、插入和删除等操作,并返回相应的行数。 在进行数据库事务处理时或不需要DataSet为数据库进行更新时,ExecuteNonQuery()方法是数据操作的 首选。因为ExecuteNonQuery()支持多种数据库语句的执行。
5.1.3 使用 ExecuteScalar()操作数据库 ExecuteScalar()方法也用来执行SQL语句,但是 ExecuteScalar()执行SQL语句后的返回值与 ExecuteNonQuery()并不相同,ExecuteScalar()方法的返回值的数据类型是 Object 类型。如果执行的 SQL 语句是一个查询语句(SELECT),则返回结果是查询后的第一行的第一列,如果执行的 SQL 语句不是 一个查询语句,则会返回一个未实例化的对象,必须通过类型转换来显示,示例代码如下所示。 string str = "server='(local)';database='mytable';uid='sa';pwd='sa'"; SqlConnection con = new SqlConnection(str); con.Open(); string strsql = "select * from mynews order by id desc"; SqlCommand cmd = new SqlCommand(strsql, con); Label1.Text = " 查询出了 Id 为" + cmd.ExecuteScalar() \; //创建连接字串 //创建连接对象 //打开连接 //使用 ExecuteScalar 查询
5.1.3 使用 ExecuteScalar()操作数据库 通常情况下 ExecuteNonQuery()操作后返回的是一个值,而 ExecuteScalar()操作后则会返回一个对象, ExecuteScalar()经常使用于当需要返回单一值时的情况。例如当插入一条数据信息时,常常需要马上知 道刚才插入的值,则可以使用 ExecuteScalar()方法。示例代码如下所示。 string str = "server='(local)';database='mytable';uid='sa';pwd='sa'"; SqlConnection con = new SqlConnection(str); con.Open(); string strsql = "insert into mynews values ('刚刚插入的 id 是多少?') SELECT @@IDENTITY as 'bh'"; SqlCommand cmd = new SqlCommand(strsql, con); Label1.Text = "刚 刚插入的行的 id 是" + cmd.ExecuteScalar(); //创建连接字串 //创建连接对象 //打开连接 //插入语句 //执行语句 //返回赋值 上述代码使用了SELECT@@IDENTITY 语法获取刚刚执行更新后的 id 值,然后通过使用ExecuteScalar()方法来获取刚刚更新后第一行第一列的值。
ExecuteXmlReader()返回 XmlReader 对象,XmlReader 特性如下所示: ExecuteXmlReader() 方法用于操作 XML 数据库,并返回一个 XmlReader 对象, 若需要使用 ExecuteXmlReader()方法,则必须添加引用 System.Xml。XmlReader 类似于 DataReader,都需要通过 Command 对象的 ExecuteXmlReader()方法来创建 XmlReader 的对象并初始化,示例代码如下所示。 XmlReader xdr = cmd.ExecuteXmlReader(); //创建 XmlReader 对象 ExecuteXmlReader()返回 XmlReader 对象,XmlReader 特性如下所示: XMLReader 是面向流的,它把 XML 文档看作是文本数据流。 XMLReader 是一个抽象类。 XMLReader 使用 pull 模式处理流。 三个派生类:XMLTextReader、XMLNodeReader 和 XMLValidatingReader string str = "server='(local)';database='mytable';uid='sa';pwd='sa'"; //创建连接字串 SqlConnection con = new SqlConnection(str); //创建连接对象 con.Open(); //打开连接 string strsql = "select * from mynews order by id desc FOR XML AUTO, XMLDATA"; SqlCommand cmd = new SqlCommand(strsql, con); //创建 Command 对象 XmlReader xdr = cmd.ExecuteXmlReader(); //创建 XmlReader 对象 Response.Write(xdr.AttributeCount); //读取节点个数 右述代码实现了获取当前节点中属性的个数。 上述代码使用了 SQL 语言中的 FOR XML AUTO,、XMLDATA 关键字,当执行 ExecuteXmlReader() 方法时,会返回 XmlReader 对象,若不指定 FOR XML AUTO,、XMLDATA 关键字,则系统会抛出异常。