我在我的应用程序中使用3层架构,在Datalayer上我很简单地获取数据集
Dataset dset= new Dataset();
try
{
dset = SqlHelper.ExecuteDataset(Con, CommandType.StoredProcedure, "StoredProcedureName", arParms);
}
catch
{}
finally
{
Con.Close();
dset.Dispose()
}
处理数据集对象有什么性能优势吗?
答案 0 :(得分:4)
如果某个对象实现了IDisposable
,则应该将其丢弃。
处理实现IDisposable
的任何对象的最佳方法是将创建包装在using
语句中:
using(var dset = SqlHelper.ExecuteDataset(Con, CommandType.StoredProcedure,
"StoredProcedureName", arParms))
{
}
以上为创建的对象生成正确的处理模式。使用这种模式是一个很好的经验法则 - 如果你一直这样做,那么你忘记处理重要事物的可能性就会大大降低。
正如Tim Schmelter commented,我没有解决绩效问题。
对于数据集,没有性能优势,因为在构造函数中抑制了处理,如this SO question的答案中所述。与此同时,调用dispose的开销很小。
我建议您针对特定用例测试这两种方法,看看哪种方法表现更好,以及使用一种方案优于另一种方案的好处是否值得减少。
答案 1 :(得分:0)
你应该处理和关闭具有IDisposable接口的连接/对象,因为你的程序将使用更少的资源和/或更快地释放它们,所以在性能上有很大的好处。
您可以创建一个新的辅助函数来执行操作,这样您每次使用数据集时都不必考虑清理:
public static void UseDataSet(Action<Dataset> code)
{
...
Dataset dset= new Dataset();
try
{
dset = SqlHelper.ExecuteDataset(Con, CommandType.StoredProcedure, "StoredProcedureName", arParms);
code(dset);
}
catch
{ }
finally
{
Con.Close();
dset.Dispose() ;
}
}
使用该功能:
Helper.UseDataSet( (dataset) =>
{
//use data set here, it will be closed and disposed afterwards
dataset.something
});