(转载)什么时候用ExecuteDataSet / ExecuteReader() / ExecuteScalar

一、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; //注意:这里改了 

}性能

二、ExecuteReaderorm

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高ci

如:cmd

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 处没有任何行。
        }string

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);
        }it

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;
        }io


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));        }

相关文章
相关标签/搜索