什麼是使用這個語法從SqlDataReader的讀取值之間的差異:爲什麼要使用GetOrdinal()SqlDataReader對象的方法
Dim reader As SqlClient.SqlDataReader
reader("value").ToString()
OR
Dim reader As SqlClient.SqlDataReader
reader.GetString(reader.GetOrdinal("value"))
什麼是使用這個語法從SqlDataReader的讀取值之間的差異:爲什麼要使用GetOrdinal()SqlDataReader對象的方法
Dim reader As SqlClient.SqlDataReader
reader("value").ToString()
OR
Dim reader As SqlClient.SqlDataReader
reader.GetString(reader.GetOrdinal("value"))
我認爲,之所以使用GetOrdinal ()可以緩存結果並多次重複使用以提高性能。
E.g.
Dim reader As SqlClient.SqlDataReader
int valueOrdinal = reader.GetOrdinal("value");
while (...)
{
var value = reader.GetString(valueOrdinal);
}
GetOrdinal
首先執行區分大小寫的查找。如果失敗,則會進行第二個不區分大小寫的搜索。 GetOrdinal
對假名寬度不敏感。因爲基於序數的查找比命名的查找效率更高,因此在循環中調用GetOrdinal
效率不高。通過調用GetOrdinal
一次並將結果賦值給循環內使用的整數變量來節省時間。
來源:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx
我只想補充一點,你有多少條記錄預期的背景下起了很大的作用,因爲如果你是返回一個單行那麼這兩個之間的性能差異也不會顯著。但是,如果您要循環多行,那麼使用類型化訪問器對性能更好,因爲它已經過優化。所以在這種情況下,如果您需要使用列名稱來獲得最佳性能,請調用GetOrdinal一次,將其放入一個變量中,然後在循環中使用帶有列序號的類型化存取器。這將產生最佳性能。
,如果你是好奇的性能差異退房my blog post
是否有人有關於使用GetOrdinal(..)行循環中相比,例如,從DB的實際數據檢索的性能影響的想法? – 2013-06-05 16:12:49
我有一個Web API服務的性能測試,它從DB存儲過程(包含多個結果集)中讀取約30-40條記錄並返回約8K大小的Json。在這個測試中,我將所有的GetOrdinal()替換爲靜態的常量,結果我得到了2%的性能提升......所以創建這種類型的列名緩存是值得的。 - 我想在大多數情況下不是。從數據庫和數據序列化中讀取數據到Json的真實情況將會更多地影響性能,所以我認爲當你已經優化了其他所有內容時,緩存的序號將是最後一件事情... – 2014-12-27 21:04:09