【发布时间】:2010-10-25 09:42:19
【问题描述】:
我们有很多数据层代码遵循这个非常普遍的模式:
public DataTable GetSomeData(string filter)
{
string sql = "SELECT * FROM [SomeTable] WHERE SomeColumn= @Filter";
DataTable result = new DataTable();
using (SqlConnection cn = new SqlConnection(GetConnectionString()))
using (SqlCommand cmd = new SqlCommand(sql, cn))
{
cmd.Parameters.Add("@Filter", SqlDbType.NVarChar, 255).Value = filter;
result.Load(cmd.ExecuteReader());
}
return result;
}
我认为我们可以做得更好。我现在的主要抱怨是它强制将所有记录加载到内存中,即使对于大型集合也是如此。我希望能够利用 DataReader 一次只在 ram 中保留一条记录的能力,但是如果我直接返回 DataReader,则在离开 using 块时连接将被切断。
如何改进这一点以允许一次返回一行?
【问题讨论】:
-
但是将所有记录加载到内存中通常不是比使用 DataReader 保持与数据库的连接打开更好吗?
-
视情况而定。对于 winforms 应用程序,是的。对于内存稀缺且无论如何查询都需要快速完成的 Web 应用程序,可能不需要。
-
您能否更详细地说明您希望拥有什么样的“DataReader 的真正优势”?
-
所以你想使用 DataReader 因为它更快地返回第一个结果?
-
与其专注于使用数据读取器的“优雅”方式,我会花更多时间处理 sql 查询本身。为什么要返回这么多行以致内存消耗成为问题?查看您的实现让我觉得查询返回的许多行从未被使用过。