2009-02-09 56 views
3

我在哪里工作我们终于来到使用强类型数据集来封装我们的一些查询到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; 
} 

如果性能真的只是在做幕后的铸造,我可以看到不会有任何加速在所有;也许这会花费更长的时间,然后才会首先调用函数调用的开销。

使用DataSets我们应该知道的其他性能优势/弱点?

谢谢!

回答

7

我不确定使用强类型数据集是否会有任何性能改进,但是您可以获得添加的类型安全性,例如,在输入字段名称时输入编译器错误。

有一个在MSDN magazine关于他们的文章,引用其中一行是:

在访问类型化的DataSet的速度相当于在访问非类型化的DataSet(因为类型化的DataSet只是更快的技术在无类型数据集上的一层)以及类型化数据集的可读性最好

另外,正如Stuart B所指出的那样,Intellisense本身就是值得的。

+0

我期望一个非常小的改进,因为在运行时没有对列名进行查找:编译器可以提前完成这项工作。但我真的怀疑这种差异是可以衡量的 – 2009-02-09 15:49:17

+0

您能否扩展访问一个无类型数据集的“快速技术”? – 2009-02-09 15:55:25

+0

尼古拉斯在链接的文章中向下滚动到“Casting Calls”部分,这里都有解释。我在下面的答案中提到了 – 2009-02-09 16:03:40

4

不要忘记智能感知。这很美味。

1

从技术上讲,应该有一个小表现击中创建一个强类型的数据集。尽管创建强类型数据集带来了很多好处。在可维护性和编程。在Intellisense之上,如果您的数据访问层发生变化,您不必搜索“列1”等所有内容。你只需要改变你实际赋值给对象的地方。

这与'is linq值得表演热门'类似。速度较慢,但​​速度轻微值得提高生产力水平。

2

强类型DataSets只是一个强类型化的包装,它将覆盖您将使用的相同的非类型化DataSet。假设您将以合理,有效的方式使用无类型的DataSet,强类型的DataSet不会更快(执行方式)。

1

是的,使用强类型数据集有一个好处 - 那就是来自列查找。按名称查找列比按类型查找列慢。为强类型数据集生成的代码按类型查找列,因此可以提高性能。

5

如果您查看为类型化数据集生成的代码,可以看到在每个类型化调用下使用字符串索引名称进行的调用。所以,他们确实没有性能提升,只有类型安全。

但是,我确实对可打字数据集中的可空字段抱怨很大。具体来说,如果你访问一个int类型的空字段,它会抛出一个异常。你必须首先调用IsMyfieldNull()调用来确定它是否为null,并且如果是的话就避免引用它。一个真正的解决方案是允许可以为空的类型字段,所以你不会冒险触发一个字段抛出异常的机会。我脑海中的这个缺陷几乎否定了强类型的好处。

相关问题