9.1 使用ADO.NET操作数据库

  上一章中介绍了ADO.NET的基本概念、ADO.NET的对象,以及如何使用ADO.NET。使用ADO.NET能够极大的方便开发人员对数据库进行操作而无需关心数据库底层之间的运行,ADO.NET不仅包括多个对象,同样包括多种方法,这些方法都可以用来执行开发人员指定的SQL语句,但是这些方法实现过程又不尽相同,本节将介绍ADO.NET中数据的操作方法。

9.1.1 使用ExecuteReader()操作数据库
  使用ExecuteReader()操作数据库,ExecuteReader()方法返回的是一个SqlDataReader对象或OleDbDataReader对象。当使用DataReader对象时,不会像DataSet那样提供无连接的数据库副本,DataReader类被设计为产生只读、只进的数据流。这些数据流都是从数据库返回的。所以,每次的访问或操作只有一个记录保存在服务器的内存中。
  相比与DataSet而言,DataReader具有较快的访问能力,并且能够使用较少的服务器资源。DataReader对象提供了“游标”形式的读取方法,当从结果中读取了一行,则“游标”会继续读取到下一行。通过Read方法可以判断数据是否还有下一行,如果存在数据,则继续运行并返回true,否则返回false。示例代码如下所示。
+展开
-C#
            string str = "server='(local)';database='mytable';uid='sa';pwd='sa'";
            SqlConnection con = new SqlConnection(str);
            con.Open();//打开连接
            string strsql = "select * from mynews";//SQL查询语句
            SqlCommand cmd = new SqlCommand(strsql, con); //初始化Command对象
            SqlDataReader rd = cmd.ExecuteReader();//初始化DataReader对象
            while (rd.Read())
            {
                Response.Write(rd["title"].ToString()); //通过索引获取列
            }

  DataReader可以提高执行效率,有两种方式可以提高代码的性能,一种是基于序号的查询;第二种情况则是使用适当的Get方法来查询。一般来说,在数据库的设计中,需要设计索引键或主键来标识,在主键的设计中,自动增长类型是经常使用的,自动增长类型通常为整型,所以基于序号的查询可以使用DataReader,示例代码如下所示。
+展开
-C#
            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);//创建Command对象
            SqlDataReader rd = cmd.ExecuteReader();//创建DataReader对象
            while (rd.Read())//遍历数据库
            {
                Response.Write(rd["title"].ToString()); //读取相应行的信息
            }

  当使用ExecuteReader()操作数据库时,会遇到知道某列的名称而不知道某列的号的情况,这种情况可以通过使用DataReader对象的GetOrdinal()方法获取相应的列号。此方法接收一个列名并返回此列名所在的列号,示例代码如下所示。
+展开
-C#
            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); //创建Command对象
            SqlDataReader rd = cmd.ExecuteReader();//创建DataReader对象
            int id = rd.GetOrdinal("title");//使用GetOrdinal方法获取title列的列号
            while (rd.Read())//遍历DataReader对象
            {
                Label1.Text = "新闻id是" + rd["id"];//输出对象的值
            }

  当完成数据库操作时,需要关闭数据库连接,DataReader对象在调用Close()方法即关闭与数据库的连接,如果在没有关闭之前又打开另一个连接,系统会抛出异常。示例代码如下所示。
+展开
-C#
            rd.Close();//关闭DataReader对象

  ExecuteReader()可以执行相应的SQL语句,例如插入、更新以及删除等,当需要执行插入、更新或删除时,可以使用ExecuteReader()进行数据操作,示例代码如下所示。
+展开
-C#
            string str = "server='(local)';database='mytable';uid='sa';pwd='sa'"; //创建连接字串
            SqlConnection con = new SqlConnection(str);//创建连接对象
            con.Open();//打开连接
            string strsql = "insert into mynews values ('执行更新后的标题')";//创建执行SQL语句
            SqlCommand cmd = new SqlCommand(strsql, con);//创建Command对象
            SqlDataReader rd = cmd.ExecuteReader();//使用ExcuteReader()方法
            while (rd.Read())//读取数据库
            {
                Response.Write(rd["title"].ToString() + "<hr/>");
            }
            rd.Close(); //关闭DataReader对象
            Response.Redirect("ExecuteReader.aspx");

  当执行了插入、删除等数据库操作时,ExecuteReader返回为空的DataReader对象。当使用Read方法遍历读取数据库时,并不会显示相应的数据信息,因为不是查询语句,则返回一个没有任何数据的System.Data.OleDb.OleDbDataReader类型的集(EOF),但是ExecuteReader方法可以执行SQL语句。如图9-1所示。
ExecuteReader()执行查询和事务处理
图9-1 ExecuteReader()执行查询和事务处理
  使用ExecuteReader()操作数据库,通常情况下是使用ExecuteReader()进行数据库查询操作,使用ExecuteReader()查询数据库能够提升查询效率,而如果需要进行数据库事务处理的话,ExecuteReader()方法并不是理想的选择。

9.1.2 使用ExecuteNonQuery()操作数据库
  使用ExecuteNonQuery()操作数据库时,ExecuteNonQuery()并不返回DataReader对象,返回的是一个整型的值,代表执行某个SQL语句后,在数据库中影响的行数,示例代码如下所示。
string str = "server='(local)';database='mytable';uid='sa';pwd='sa'"; //创建连接字串
+展开
-C#
            SqlConnection con = new SqlConnection(str);//创建连接对象
            con.Open();//打开连接
            string strsql = "select top 5 * from mynews order by id desc";
            SqlCommand cmd = new SqlCommand(strsql, con);//使用ExecuteNonQuery
            Label1.Text="该操作影响了"+cmd.ExecuteNonQuery()+"行";//执行SQL语句并返回行

  上述代码使用了SELECT语句,并执行语句,返回受影响的行数。运行后,发现返回的结果为-1,说明,当使用SELECT语句时,并没有对任何行有任何影响。ExecuteNonQuery()通常情况下为数据库事务处理的首选,当需要执行插入、删除、更新等操作时,首选ExecuteNonQuery()。
  对于更新、插入和删除的SQL句,ExecuteNonQuery()方法的返回值为该命令所影响的行数。对于“CREATE TABLE”和“DROP TABLE”语句,返回值为0,而对于所有其他类型的语句,返回值为-1。ExecuteNonQuery()操作数据时,可以不使用DataSet直接更改数据库中的数据,示例代码如下所示。
+展开
-C#
        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";//编写执行删除的SQL语句
            SqlCommand cmd = new SqlCommand(strsql, con); //创建Command对象
            Label1.Text = "该操作影响了" + cmd.ExecuteNonQuery() + "行";//返回影响行数
        }

  运行上述代码后,会执行删除id号大于4的数据事务,当执行删除并删除完毕后,则ExecuteNonQuery()方法返回受影响的行数,如图9-2所示。
ExecuteNonQuery()方法
图9-2 ExecuteNonQuery()方法
  ExecuteNonQuery()操作主要进行数据库操作,包括更新、插入和删除等操作,并返回相应的行数。在进行数据库事务处理时或不需要DataSet为数据库进行更新时,ExecuteNonQuery()方法是数据操作的首选。因为ExecuteNonQuery()支持多种数据库语句的执行。
注意:有些项目中,通过判断ExecuteNonQuery()的返回值来判断SQL语句是否执行成功,这样是有失偏颇的,因为当使用创建表的语句时,就算执行成功也会返回-1。

9.1.3 使用ExecuteScalar()操作数据库
  ExecuteScalar()方法也用来执行SQL语句,但是ExecuteScalar()执行SQL语句后的返回值与ExecuteNonQuery()并不相同,ExecuteScalar()方法的返回值的数据类型是Object类型。如果执行的SQL语句是一个查询语句(SELECT),则返回结果是查询后的第一行的第一列,如果执行的SQL语句不是一个查询语句,则会返回一个未实例化的对象,必须通过类型转换来显示,示例代码如下所示。
+展开
-C#
            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查询

  通常情况下ExecuteNonQuery()操作后返回的是一个值,而ExecuteScalar()操作后则会返回一个对象,ExecuteScalar()经常使用于当需要返回单一值时的情况。例如当插入一条数据信息时,常常需要马上知道刚才插入的值,则可以使用ExecuteScalar()方法。示例代码如下所示。
+展开
-C#
            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()方法来获取刚刚更新后第一行第一列的值。

9.1.4 使用ExecuteXmlReader()操作数据库
  ExecuteXmlReader()方法用于操作XML数据库,并返回一个XmlReader对象,若需要使用ExecuteXmlReader()方法,则必须添加引用System.Xml。XmlReader类似于DataReader,都需要通过Command对象的ExecuteXmlReader()方法来创建XmlReader的对象并初始化,示例代码如下所示。
+展开
-C#
XmlReader xdr = cmd.ExecuteXmlReader();//创建XmlReader对象

ExecuteXmlReader()返回XmlReader对象,XmlReader特性如下所示:
1)XMLReader是面向流的,它把XML文档看作是文本数据流。
2)XMLReader是一个抽象类。
3)XMLReader使用pull模式处理流。
4)三个派生类:XMLTextReader、XMLNodeReader和XMLValidatingReader
下面代码实现了获取当前节点中属性的个数。
+展开
-C#
            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关键字,则系统会抛出异常。

加支付宝好友偷能量挖...


评论(0)网络
阅读(115)喜欢(0)Asp.Net/C#/WCF