在我工作的地方,我们终于想到使用强类型数据集将我们的一些查询封装到sqlserver。我一直在吹嘘的一个想法是强类型列的强度,主要是因为不需要转换任何数据。我认为强类型数据集会在以下可能存在数千行的情况下提高性能,这是错误的吗?
老路:using(DataTable dt = sql.ExecuteSomeQuery())
{
foreach (DataRow dr in dt.Rows)
{
var something = (string)dr["something"];
var somethingelse = (int)dr["somethingelse"];
}
}
新方式:
MyDataAdapter.Fill(MyDataset);
foreach (DataRow dr in MyDataset.MyDT.Rows)
{
var something = dr.Something;
var somethingelse = dr.SomethingElse;
}
如果属性真的只是在幕后进行投射,我可以看到根本不会有任何加速;或许它需要更长的时间才能获得函数调用的开销。
使用我们应该了解的DataSet还有其他任何性能优势/劣势吗?
谢谢!
答案 0 :(得分:7)
我不确定使用强类型数据集是否会有任何性能改进,但是您可以获得添加的类型安全性,例如,当您输入字段名称时,会出现编译错误。
MSDN magazine中有一篇关于它们的文章,引用其中的一行:
访问类型化DataSet的速度与访问非类型化DataSet的速度更快(因为类型化DataSet只是无类型DataSet上的层)并且类型化DataSet的可读性最佳
此外,正如斯图尔特B所指出的那样,仅凭智能感知就值得。
答案 1 :(得分:6)
如果查看为类型化数据集生成的代码,可以看到每个类型化调用下的是使用字符串索引名称进行的调用。因此,他们确实没有提供性能提升,只提供类型安全性。
然而,我对键入的数据集中的可空字段抱有很大的抱怨。具体来说,如果您访问一个为null的int字段,则会抛出异常..您必须首先调用IsMyfieldNull()调用以确定它是否为null,并且如果是,则避免引用它。一个真正的解决方案是允许可空类型字段,因此您不会冒险只为触摸字段而抛出异常的风险。我心中的这个缺陷几乎否定了强力打字的好处。
答案 2 :(得分:4)
不要忘记Intellisense。好吃。
答案 3 :(得分:2)
强类型DataSet只是一个强类型的包装器,它与你原本使用的相同的无类型DataSet相比。假设您将以合理,有效的方式使用非类型化DataSet,强类型DataSet将不会更快(执行方式)。
答案 4 :(得分:1)
从技术上讲,创建强类型数据集应该有小的性能影响。尽管如此,创建强类型数据集会带来很多好处。在可维护性和编程方面。在Intellisense之上,如果您的数据访问层发生了某些变化,您将不必搜索“第1列”之类的所有内容。您只需要更改实际为对象分配值的位置。
这类似于'是值得性能打击的linq'。它的速度较慢,但速度的提高值得提高生产力水平。
答案 5 :(得分:1)
是的,使用强类型数据集有一个好处 - 那就是来自列查找。按名称查找列比按类型查找列要慢。为强类型数据集生成的代码按类型查找列,因此您可以获得一些性能提升。