熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#高級編程:數據讀取器[2]

2013-11-13 12:12:28  來源: .NET編程 
    ——此文章摘自《C#高級編程(第版)》定價元 特價元 購買

    假定CategoryID字段是SELECT語句中用於生成閱讀器的第一個字段那麼這兩行語句的功能就是相同的但後者比前者慢一些為了驗證這一點編寫一個簡單的測試程序從打開的數據讀取器上對同一列進行一百萬次的迭代訪問獲取一些足夠大的數字雖然在一個循環中可能並不會對同一列訪問一百萬次但按每秒來計算就可能編寫出最佳的代碼

    另外數字索引器平均每秒就進行一百萬次的訪問而文本索引器則需要原因是文本方法是從模式的內部查找列號再使用列號的順序進行訪問如果知道這個區別就可以更好地訪問數據

    是否應使用數字索引器?也許但還有一種更好的方式

    除了上面給出的索引器外OleDbDataReader還有一組類型安全的方法可以用於讀取列這些方法都可以進行自我解釋且都以Get開頭有一些方法可以讀取大多數類型的數據例如GetInt GetFloat和GetGuid等

    前面使用GetInt的一百萬次迭代用了數字索引器中的系統開銷是獲取數據類型調用與GetInt相同的代碼然後裝箱(本實例是拆箱)為一個整數如果以前知道這種模式並希望使用加密數字而不是列名以避免對每個列訪問使用類型安全的函數這樣運行速度就會比使用文本格式的列名快倍(選擇同一列的上百萬個副本)

    在可維護性和速度之間有一個折中的問題如果必須使用數字索引器就應在類的范圍內為每一個要訪問的列定義常量上面的代碼可以用於從任何OLE DB數據庫中選擇數據但有許多SQL Server的特定類可以使用但其便利性有明顯的損失

    下面的示例與上一示例基本相同但在這個實例中用SQL提供程序和SQL類的引用替換了OLE DB提供程序和對OLE DB類的所有引用代碼的變化已經突出顯示出來了該示例在_DataReaderSql目錄下
    using System;
    using SystemDataSqlClient;
    public class DataReaderSql
    {
       public static int Main(string[] args)
       {
          string source =server=(local)\\NetSDK; +
                      integrated security=SSPI; +
                      database=northwind;
          string select = SELECT ContactNameCompanyName FROM Customers;
          SqlConnection conn = new SqlConnection(source);
          connOpen();
          SqlCommand cmd = new SqlCommand(select conn);
          SqlDataReader aReader = cmdExecuteReader();
          while(aReaderRead())
             ConsoleWriteLine({} from {} aReaderGetString()
                                aReaderGetString());
          aReaderClose();
          connClose();
          return ;
       }
    }

    注意區別是什麼?如果鍵入這些代碼用sql替換所有的OleDb改變數據源字符串重新編譯這是很容易的

    對Sql提供程序的索引器進行相同的性能測試這次數字索引器也使用秒就完成了百萬次的訪問基於索引器的字符串運行了本機的Sql提供程序要比OleDb快直到我在NET版本中測試這一部分情況都是這樣可以肯定這是不正常的因為我使用的是最簡單的測試(對同一個值選擇 次)在托管SQL提供程序上進行真實的測試會得到更好的性能

[]  []  


From:http://tw.wingwit.com/Article/program/net/201311/15404.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.