平时 数据都是用实体类 或者ILIST<实体类>所以涉及到一个 数据转换为实体~请问只是用来转换为实体对象 或者LIST<实体类> 集合 用 datareader 好 还是 dataset好呢~ 说下原因 谢谢~~datareader 只读向前 速度快 可是周公 这篇文章 测试发现 http://zhoufoxcn.blog.51cto.com/792419/614794datatable 快~ 问问大家平时用的哪个~ 谢谢
解决方案 »
- 如何从String转换为数据库的bit型?
- repeater中radiobuttonlist如何绑定数据?
- Gridview 怎样根据选择的不同显示不同的内容?
- 很简单的问题啊,<asp:Button>控件,如何在启用了这个事件OnClientClick="check()" 再启用这个事件OnClick="Button1_Click"
- 关于动态改变CSS样式表文件的问题?
- 怎么样判断xml文档中是否有任何节点..
- 在 类库 中能否 读 asp.net 工程Web.Config文件.
- 用户控件中的图片路径问题
- 关于表单验证的问题。
- 我在页面A中打开一个弹出窗口B,现需要将B中控件BTEXTBOX的值d传到A的控件ATEXTBOX1,atextbox2,和atextbox3中,如何能做到?
- mvc3 的空间引用
- 求两个表数据如何绑定到一个treeview 控件中
多谢~~ 目前我也是使用的 dataset~
datareader 要注意关闭 看个人爱好习惯吧。
{
void Convert(DbDataReader reader, T obj);
}而你的BLL内部的需要从DataReader读取出实体的对象就都可以实现这个接口,例如我随便举一个例子:public class FileTransferBlock : IConverterFromDbDataReader<FileTransferBlock>
{
public long CallID;
public string SourceFile;
public string TargetFile;
public long StartPosition; public void Convert(DbDataReader reader, FileTransferBlock obj)
{
obj.CallID = (long)reader["call_id"];
obj.SourceFile = (string)reader["source"];
obj.TargetFile = (string)reader["target"];
obj.StartPosition = (long)reader["position"];
}
}
这个例子清楚地说明了,如何将DataReader轻松地转换到对象的字段(或者属性)上。这并不增加多少工作量,因为你平常使用SqlHelper之类的来得到对象、或者从某种离散的一堆列值中得到对象时做的工作绝对不比这个更少。剩下的SqlHelper中工作就非常清楚了,比如说它可能是这样写的static public List<T> GetRecords<T>(string sql, params DbParameter[] para) where T : IConverterFromDbDataReader<T>, new()
{
using (DbConnection conn = CreateNewConnection())
{
conn.Open();
var comm = conn.CreateCommand();
comm.CommandText = sql;
comm.Parameters.AddRange(para);
var reader = comm.ExecuteReader();
var result = new List<T>();
while (reader.Read())
{
var obj = new T();
obj.Convert(reader, obj);
result.Add(obj);
}
return result;
}
}
那么我们直接调用 GetRecords<FileTransferBlock>(sqlString,null) 就能得到一个 FileTransferBlock 对象集合了。
上述,是因为这里讨论到比较底层的SqlHelper的写法。但是我的重点不单单是关于这个写法,我要强调的是:不要随便使用反射,而且大多数时候你也根本不需要使用反射!
{
void ConvertFrom(DbDataReader reader);
}public class FileTransferBlock : IConverterFromDbDataReader<FileTransferBlock>
{
public long CallID;
public string SourceFile;
public string TargetFile;
public long StartPosition; public void ConvertFrom(DbDataReader reader)
{
this.CallID = (long)reader["call_id"];
this.SourceFile = (string)reader["source"];
this.TargetFile = (string)reader["target"];
this.StartPosition = (long)reader["position"];
}
}static public List<T> GetRecords<T>(string sql, params DbParameter[] para) where T : IConverterFromDbDataReader<T>, new()
{
using (DbConnection conn = CreateNewConnection())
{
conn.Open();
var comm = conn.CreateCommand();
comm.CommandText = sql;
comm.Parameters.AddRange(para);
var reader = comm.ExecuteReader();
var result = new List<T>();
while (reader.Read())
{
var obj = new T();
obj.ConvertFrom(reader);
result.Add(obj);
}
return result;
}
}
这个说法是不对的!仅仅对于设置 CommandBehavior 为 CloseConnection 的 SqlDataReader 对象实例,并且当它已经离开了 Connection 控制变量的作用域(也就是说你的代码不可能去对其执行 Close()操作),你才需要通过执行 reader.Close() 来关闭Connection。其它的都是多余的,额外地占用了时间。通用的DbDataReader根本没有 CommandBehavior,那么也根本没有这个机制。而就算是针对SqlDataReader,你也只有机器特定的情况下才有必要去想着调用其 Close() 方法。
他从DataTable转换为对象也是通过反射的,所以最后结果应该还是用DataReader快一些,当然差别是很小的。
单单比较DataTable和DbDataReader没意义,因为DataTable跟数据库完全无关,只是存放的从DbDataReader读取的数据