(转载)何时用ExecuteDataSet / ExecuteReader() / ExecuteScalar

1、ExecuteDataset

ExecuteDataset会运行你的基本SELECT(选择)查询并生成一个DataSet,然后就能够被绑定到服务器对象上,或者被用来创建DataView(数据视图)。

public static DataSet ExecuteDataSet(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) 
{

SqlCommand cmd = new SqlCommand();

using (SqlConnection conn = new SqlConnection(connectionString)) 

//通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中 
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); 
SqlDataAdapter sda = new SqlDataAdapter(); 
DataSet ds = new DataSet(); 
sda.Fill(ds); 
//清空SqlCommand中的参数列表 
cmd.Parameters.Clear(); 
return ds; //注意:这里改了 

}

2、ExecuteReader

ExecuteReader主要是用于查询语句(SELECT),它是为了提高运行性能而设置的。SqlDataReaders很类似于经典 ADO里的只能向前的只读记录集(即类似ASP中的movenext),它们对于填充ListBoxe控件和CheckBoxList控件很有用处。对ExecuteReader的调用看起来就像是一个ExecuteDataset。要记住,它需要命名空间为System.Data.SqlClient:

所以以后如果SQL语句中,只要是查找单条的数据中的某个字段或全部字段时,如select top 1 * from XX where id=xx;用DataSet (即ExecuteDataSet ),但是如果说满足id=xx的结果有很多个数据,此时用ExecuteReader,因为它能够查询出“只读的向前的数据流”(如ASP中的movenext 一样,明白了吧,哈哈),如果此时用ExecuteDataSet就错了,更何况ExecuteReader读取数据的效率会比ExecuteDataSet高

如:

public string GetClass(int id) //获取类别名称
        {
            string commText = string.Format("select ClassName as [text] from FAQ_Class where ID={0}", id);
            DataSet ds = db.ExecuteDataSet(CommandType.Text, commText);
            return ds.Tables[0].Rows[0]["text"].ToString();//在位置 0 处没有任何行。
        }

public DataSet GetTitle(int recordCount, decimal id) //获取类别对应的前6条标题
        {
            string commText = string.Format("select top {0} ID,Title as [Title] from FAQ_List where ClassID like ‘{1}%‘ and Rechecked=1 order by OrderID desc", recordCount, id);
            return db.ExecuteDataSet(CommandType.Text, commText);
        }

public DataRowView GetSingleResult(int id) //获取单条记录
        {
            DataRowView result = null;
            DataSet ds = db.ExecuteDataSet(CommandType.Text, string.Format("select * from FAQ_List where id={0}", id));
            if (ds != null && ds.Tables[0] != null && ds.Tables[0].DefaultView.Count > 0)//ds/表/数据行不为空(程序严紧,周全性)
            {
                result = ds.Tables[0].DefaultView[0];
            }
            return result;
        }

public IDataReader GetClassName(int id) //查找ClassName
        {
            string commText = string.Format("select ID as ID,ClassName as ClassName from FAQ_Class where ParentID=0 order by OrderID desc,ID desc", id);
            return db.ExecuteReader(CommandType.Text, commText);
        }

3.对于使用ExecuteScalar(),返回查询出来的结果集中的第一行第一列,虽然返回的值的数据类型可以是string,int。。。但msdn.com微软上说:

使用 ExecuteScalar 方法从数据库中检索单个值(例如一个聚合值)。与使用 ExecuteReader 方法,然后使用 SqlDataReader 返回的数据执行生成单个值所需的操作相比,此操作需要的代码较少。所以我习惯在count(字段)才用ExecuteScalar,如:

public int SelClass(decimal id) //添加类别
        {
            string commText = string.Format("select Count(id) as [Count] from FAQ_List where ClassID like ‘{0}%‘", id);
            return Convert.ToInt32(db.ExecuteScalar(CommandType.Text, commText));
        }

时间: 2024-10-10 17:36:04

(转载)何时用ExecuteDataSet / ExecuteReader() / ExecuteScalar的相关文章

ExecuteNonQuery,ExecuteReader,ExecuteScalar 区别

ExecuteNonQuery方法 :执行非查询SQL操作,包括增insert.删delete.改update ExcuteReader方法 :执行查询,返回DataReader,通过DataReader的对象dr["列名"] 可以取得数据,一次读一行,可以通过while(dr.Read())进行循环读取 ExecuteScalar方法 :执行查询,只返回一个数据 在连接SQL Server数据库:首先创建SqlConnection类和SqlCommand类实例分别用于连接到SQL S

EF入门 IQueryable和IEnumberable的区别

IEnumerable接口 公开枚举器,该枚举器支持在指定类型的集合上进行简单迭代.也就是说:实现了此接口的object,就可以直接使用foreach遍历此object: IQueryable 接口 它继承 IEnumerable 接口,而因为.net版本加入Linq和IQueryable后,使得IEnumerable不再那么单调,变得更加强大和丰富. 为了区别两个接口,我们通过一个实际的例子来解释一下. 编写如下代码: static void Main(string[] args) { //创

SqlHelper——数据库小助手

SqlHelper事实上就是一个类. 早就听说过"SqlHelper"这个名词.也查过相关的资料.但还是一头雾水.当真的去实践去用它时,就会发现事实上它没那么神奇. 当敲第一个窗口的时候.功能实现了,我们就会认为非常高兴.大功告成了.但是当敲完第二个窗口.第三个窗口的时候,慢慢的就開始认为代码反复的太多了.越敲就越认为心虚.尽管设计模式学的不怎么样,但是最起码让我有了这个意识去想怎么让代码更少一些.让彼此之间的耦合度尽量降低. 在三层中,要数D层的代码相似度最高了,总结来说,也就是连接

Entity Framework中IQueryable, IEnumerable, IList的区别

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 使用工具追踪EF生成的SQL 使用Entity Framework等ORM框架的时候,SQL对于使用者来说是透明的,往往很多人也不关心ORM所生成的SQL,然而系统出现性能问题的时候就必须关注生成的SQL以发现问题所在. 使用过Toplink的

ADO.NET第3讲

一.DataReader和DataSet的区别 1.DataReader是只能顺序向前读取的数据结构,占据内存较少,速度较快:DataSet是一次性读入内存后动态(dynamic)方式处理记录(可正向反向兑取数据,也可以指定记录读取)的数据结构,占据内存较多,相对速度较慢. 2.DataReader处理数据时需要一直连接数据库,但DataSet读取数据后不需要连接数据库. 3.DataReader只能对一个结果集进行处理,但DataSet里可以存储多个结果集(DataTable). 4.Data

HTML5 离线存储之Web SQL

HTML5 在离线存储之Web SQL 本篇没有考虑异步,多线程及SQL注入 WebDatabase 规范中说这份规范不再维护了,原因是同质化(几乎实现者都选择了Sqlite), 且不说这些,单看在HTML5中如何实现离线数据的CRUD,最基本的用法(入门级别)  1,打开数据库 2,创建表 3,新增数据 4,更新数据 5,读取数据 6,删除数据 事实上,关键点在于如何拿到一个可执行SQL语句的上下文, 像创建表,删除表,CRUD操作等仅区别于SQL语句的写法.OK,貌似"SqlHelper&q

链接SQL、事务---小总结

ADO.NET两个命名空间,三个类.一.两个命名空间:using System.Data;using System.Data.SqlClient; 二.三个类:SqlConnection SqlCommand SqlDataReader (一)SqlConnection链接类1.构造链接字符串的写法:server=服务器IP或服务器名;database=数据库名;uid=用户名;pwd=密码server=.;database=mydb;uid=sa;pwd=123Data Source=.;In

使用工具追踪Entity Framework生成的SQL

学习entity framework期间收集的文章,转自http://www.cnblogs.com/hiteddy/archive/2011/10/01/Difference_among_IQueryable_IEnumeralb_IList_in_Entity_Framework.html 使用Entity Framework等ORM框架的时候,SQL对于使用者来说是透明的,往往很多人也不关心ORM所生成的SQL,然而系统出现性能问题的时候就必须关注生成的SQL以发现问题所在. 使用过Top

(转)HTML 5离线存储之Web SQL

原文:http://developer.51cto.com/art/201106/267357.htm HTML 5离线存储之Web SQL 2011-06-07 15:14 kkun kkun的博客 字号:T | T WebDatabase 规范中说这份规范不再维护了,原因是同质化(几乎实现者都选择了Sqlite), 且不说这些,单看在HTML5中如何实现离线数据的CRUD,最基本的用法(入门级别) AD:51CTO学院:IT精品课程在线看! 本篇没有考虑异步,多线程及SQL注入 WebDat