(轉載)什麼時候用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));        }

相關文章
相關標籤/搜索