2009-02-09 37 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,並且如果是的話就避免引用它。一個真正的解決方案是允許可以爲空的類型字段,所以你不會冒險觸發一個字段拋出異常的機會。我腦海中的這個缺陷幾乎否定了強類型的好處。

相關問題