(转载)何时用ExecuteDataSet / ExecuteReader() / ExecuteScalar
2015-07-25 16:25
387 查看
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));
}
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));
}
相关文章推荐
- Android 自定义View(自定义控件)
- [LeetCode] Kth Largest Element in an Array
- 噩梦5 敌人血量
- [网络流24题] 03 最小路径覆盖问题(有向无环图最小路径覆盖,网络最大流)
- 简单好用的Adapter---ArrayAdapter
- POJ 1026-Cipher(置换群)
- 希腊字母发音对照表
- 【编程之美】java二进制实现重建
- 关于c,c++,oc,swift的混合编程
- HDU 5301 Friends(DFS + 枚举)
- 【转载】计算1至n中数字X出现的次数
- 【Spring学习笔记-MVC-18.1】Spring MVC实现RESTful风格-同一资源,多种展现:xml-json-html
- 互联网如何为文化产业赋能?
- 黑马程序员——Java IO总结二
- USACO Section 1.3 : Calf Flac (calfflac)
- hdoj 3605 Escape
- VMware虚拟机无法识别U盘解决方案
- [Angularjs]ng-class,ng-class-even,ng-class-odd
- Augreener自发电遥控开关再掀无源无线技术风暴
- readTextFile.py