C#中ExecuteReader、ExecuteNonQuery、ExecuteScalar、SqlDataReader、SqlDataAdapter应该怎么用?

对于C#初学者来说,我们通常遇到ExecuteReader、ExecuteNonQuery、ExecuteScalar、SqlDataReader、SqlDataAdapter这些对象或者方法的时候就开始犯晕,不知道哪个对象适合用增删改,哪个对象适合查询的时候用,本人通过网上搜索和个人的一些理解,整理了一下,有错误的地方希望大家能给出指正。

一、
//数据库连接字符串
    privatereadonly static string connectionString=      ConfigurationManager.ConnectionStrings["MyConnection"].ToString();

    ///
    /// 执行增,删,改的方法,支持存储过程
    ///
    ///连接字符串,自满足,请用SqlHelper.connString赋值
    ///命令类型,如果是sql语句,则为CommandType.Text,否则为  CommandType.StoredProcdure
    ///SQL语句或者存储过程名称
    ///SQL参数,如果没有参数,则为null
    ///受影响的行数
    publicstatic int ExecuteNonQuery(CommandType commandType, string cmdText,params   SqlParameter[]para)
    {
       using (SqlConnection conn = newSqlConnection(connectionString))
       {
           SqlCommand cmd = new SqlCommand();
           cmd.Connection = conn;
           cmd.CommandType = commandType;
           cmd.CommandText = cmdText;
           if (para != null)
           {
               cmd.Parameters.AddRange(para);
           }
           conn.Open();
           return Convert.ToInt32(cmd.ExecuteNonQuery());
       }
   }
注:1、ExecuteNonQuery()执行命令对象的SQL语句,返回一个int类型的变量,返回数据库操作之后影响的行数。适合用来验证对数据库进行增删改的情况。

        2、ExecuteScalar()也返回一个int型变量。如果SQL语句是Select查询,则仅仅返回查询结果集中第一行第一列,而忽略其他行和列。如果SQL语句不是Select查询,则这个返回结果没任何作用。(建议查询数据库时使用)  由于不知道sql语句到底是什么样的结构(有可能是int,有可能是Char等其它,)所以ExecuteScalar()方法返回一个最基本的类型Object,这个类型是所有类型的基类,可以转换为任意类型,所以所以用前需强制转换。

二、   

///

   ///执行查询的方法,支持存储过程

   /// SQL参数,如果没有参数,则为null      

   /// 返回查询结果的第一行第一列

   public static object GetScalar(CommandType commandType, stringcmdText, params SqlParameter[] para)

   {

       object result = null;

       using (SqlConnection conn = newSqlConnection(connectionString))

       {

           SqlCommand cmd = new SqlCommand();

           cmd.Connection = conn;

           cmd.CommandType = commandType;

           cmd.CommandText = cmdText;

           if (para != null)

           {

               cmd.Parameters.AddRange(para);

           }

           conn.Open();

           result= cmd.ExecuteScalar();

       }

       return result;

   }

 

}

注:ExecuteScalar()也返回一个int型变量。如果SQL语句是Select查询,则仅仅返回查询结果集中第一行第一列,而忽略其他行和列。如果SQL语句不是Select查询,则这个返回结果没任何作用。(建议查询数据库时使用)  由于不知道sql语句到底是什么样的结构(有可能是int,有可能是Char等其它,)所以ExecuteScalar()方法返回一个最基本的类型Object,这个类型是所有类型的基类,可以转换为任意类型,所以用前需强制转换。

 

 

三:

///

   /// 执行查询的方法,支持存储过程

   /// SQL参数,如果没有参数,则为null

   /// 读取器SqlDataReader

   public static SqlDataReader ExecuteReader(CommandType commandType,string cmdText, params SqlParameter[] para)

   {

       SqlConnection conn = newSqlConnection(connectionString);

       SqlDataReader dr = null;

       SqlCommand cmd = new SqlCommand();

       cmd.Connection = conn;

       cmd.CommandType = commandType;

       cmd.CommandText = cmdText;

       if (para != null)

       {

           cmd.Parameters.AddRange(para);

       }

       conn.Open();

       dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

       return dr;

注:1、ExecuteReader方法存在的目的:尽可能快的对数据库进行查询并得到结果

        2、ExecuteReader返回一个DataReader对象,如果在SqlCommand对象中调用,

则返回SqlDataReader,如果在OledbCommand对象中调用,返回的是OledbDataReader,可以调用DataReader的方法和属性迭代处理结果集。

 

 

四:

///

       ///执行查询的方法,支持存储过程

   /// SQL语句或者存储过程名称

   /// SQL参数,如果没有参数,则为null

   /// 数据集

   public static DataSet GetDataSet(CommandType commandType, stringcmdText, params SqlParameter[] para)

   {

       using (SqlConnection conn = newSqlConnection(connectionString))

       {

           SqlDataAdapter da = new SqlDataAdapter();

           da.SelectCommand= new SqlCommand();

           da.SelectCommand.Connection = conn;

           da.SelectCommand.CommandText = cmdText;

           da.SelectCommand.CommandType = commandType;

           if (para != null)

           {

               da.SelectCommand.Parameters.AddRange(para);

           }

           DataSet ds = newDataSet();

           conn.Open();

           da.Fill(ds);

           return ds;

       }

}

 

SqlDataReader与SqlDataAdapter+DataSet的区别

一,SqlDataReader //基于连接,只读访问适合数据量较小。(连接模式)

     SqlDataAdapter //基于非连接,适于数据量较大时,可以另行修改,最后再把修改结果返回给数据库。要求资源也大一点 (断开模式)

二,SqlDataAdapter 读取数据后将数据集放入DataSet ,DataSet 的数据存在本地客服机内存。

三,SqlDataReader返回的是一个数据读写器,只能一条条的读,操作起来不灵活,一般在只读的时候才用到。

     SqlDataAdapter返回的是数据集或者表,可以对其中的数据作任意操作

四,写法上不同:

    SqlDatReader执行前须先打开数据库,然后须生成一个command对象。再由command.ExecuteReader()方法赋值。完成后须手动关闭联接。

    SqlCommand cmd = new SqlCommand("select * from stu",conn);

           conn.Open();

           SqlDataReader rdr = cmd.ExecuteReader();

           。。。。。

           conn.close();

      SqlDataAdapter 执行时,自动打数据库,且不用Command的ExecuteReader方法进行赋值,完成后自动断开联接。

           SqlDataAdapter adptr = new SqlDataAdapter(sql, conn);

           DataSet ds = new DataSet();

           adptr.Fill(ds, "stu");

   

   

实例:

1,运用SqlDataReader读取数据

class DataReader

   {

       static void Main()

       {

           string str ="server=localhost;uid=sa;pwd=123;database=northwind";

           SqlConnection conn = new SqlConnection(str);

           SqlCommand cmd = new SqlCommand("select * from stu",conn);

           conn.Open();

           SqlDataReader rdr = cmd.ExecuteReader();

            DataTable table=new Datable();

           table.Load(rdr);

            rdr.Close();

           conn.Close();

       }

2,运用SqlDataAdapter+DataSet 读取修改数据

        

    classSqlDataAdapter

   {

       static void Main()

       {

           string str ="server=localhost;uid=sa;pwd=123;database=northwind";

           SqlConnection conn = new SqlConnection(str);

           string sql = "select * from stu";

           SqlDataAdapter adptr = new SqlDataAdapter(sql,conn);//Adepter对象

           DataSet ds = new DataSet();//DataSet对象

           adptr.Fill(ds, "stu");//填充DataSet并为当前表命名

           DataTableReader rdr = ds.CreateDataReader();

           while (rdr.Read())//读取表中数据

           {

               for (int i = 0; i < rdr.FieldCount; i++)

               {

                   Console.Write(rdr.GetName(i) + "\t" + rdr.GetValue(i) +"\t");

               }

               Console.WriteLine();

           }

       }

 


参考链接:
  http://blog.163.com/zhangningning8808@126/blog/static/1314263812009111381920187/
 
由于小宁博主对

SqlDataReader与SqlDataAdapter+DataSet的区别

总结的很到位,所以就把他的文章整体粘贴下来了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值