在我工作的地方,我们终于开始使用强类型数据集将一些查询封装到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还有其他任何性能优势/劣势吗?
谢谢!
我不确定使用强类型数据集是否会有任何性能改进,但是您可以获得添加的类型安全性,例如,当您输入字段名称时,编译器会出现错误.
在MSDN杂志中有一篇关于它们的文章,引用其中的一行:
访问类型化DataSet的速度与访问非类型化DataSet的速度更快(因为类型化DataSet只是非类型化DataSet上的层)并且类型化DataSet的可读性最佳
此外,正如斯图尔特B所指出的,仅凭智能感知就值得.
如果查看为类型化数据集生成的代码,可以看到每个类型化调用下的是使用字符串索引名称进行的调用.因此,他们确实没有提供性能提升,只提供类型安全性.
但是,我对键入的数据集中的可空字段抱有很大的抱怨.具体来说,如果您访问一个为null的int字段,则会抛出异常..您必须首先调用IsMyfieldNull()调用以确定它是否为null,并且如果是,则避免引用它.一个真正的解决方案是允许可空类型字段,因此您不会冒险只为触摸字段而抛出异常的风险.我心中的这个缺陷几乎否定了强力打字的好处.