2010-05-14 57 views
0

我最近向一位同事提倡我們用一個SqlDataReader替換一些使用sqlcmd命令行實用工具的C#代碼。舊代碼使用: System.Diagnostics.ProcessStartInfo procStartInfo = 新System.Diagnostics.ProcessStartInfo( 「CMD」, 「/ C」 + SQLCMD); wher SQLCMD是像 「SQLCMD -S」 + SERVERNAME + 「-y 0 -h-1 -Q」 + 「\」」 + 「USE [」 +數據庫+ 「]」 + 「; + txtQuery.Text +」 \「」; \SQLDataReader比使用命令行實用程序sqlcmd慢嗎?

然後使用正則表達式對結果進行分析我認爲使用SQLDataReader會更符合行業慣例,更容易調試和維護,並且可能會更快,但SQLDataReader方法至少。同樣的速度,很可能較慢我相信我做正確的一切與SqlDataReader的代碼是:

using (SqlConnection connection = 
     new SqlConnection()) 
     { 
      try 
      { 
       SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString); 
       connection.ConnectionString = builder.ToString(); ; 
       SqlCommand command = 
        new SqlCommand(queryString, connection); 

       connection.Open(); 



       SqlDataReader reader = command.ExecuteReader(); 

    // do stuff w/ reader 
       reader.Close(); 

      } 
      catch (Exception ex) 
      { 
       outputMessage += (ex.Message); 
      } 
     } 

我用System.Diagnostics.Stopwatch時間兩種方法和命令行實用程序(稱爲來自C#代碼)似乎更快(20-40 %?)。 SqlDataReader有一個很好的特性,即當再次調用相同的代碼時,它的速度很快,但對於這個應用程序,我們沒有預料到這一點。

我已經對這個問題做了一些研究。我注意到命令行實用程序sqlcmd使用OLE DB技術來訪問數據庫。這比ADO.NET快嗎?我真的很驚訝,特別是因爲命令行實用程序方法涉及啓動一個過程。我真的認爲它會變慢。

有什麼想法?

謝謝, 戴夫

+0

'//做東西w/reader'可能很重要。那裏有什麼? – 2010-05-14 03:23:47

+0

20-40%顯着嗎?我們是否正在談論一個過程,其中一個需要500毫秒,另一個需要600毫秒?或者是幾秒鐘或更長時間? – 2010-05-14 03:25:19

+0

山姆,這是300的差別左右與350至600(取決於誰在做測試,我相信我讀了人類無法察覺不到200毫秒所以有一些擔憂。 該數據在被檢索點擊用戶點擊「顯示結果」按鈕,在此之前很難獲取數據,因爲他可能會改變它直到最後一刻 坦率地說,我很驚訝SQLDataReader不是那麼快或更快,但請參閱TimLi的回答(DataReader也獲取模式信息)。do stuff/w閱讀器速度極快(<15毫秒)。 謝謝 – Dave 2010-05-14 22:45:56

回答

0

我覺得SqlDataReader的比SQLCMD慢,因爲做一個SqlDataReader不僅獲取數據,而且還獲取數據庫模式信息,並僅SQLCMD獲取數據。 你可以得到一個列名,像這樣一個DataReader:

for (int i = 0; i < reader.FieldCount; i++) 
{ 
    Console.WriteLine(reader.GetName(i)); 
} 

有時表現並不重要,安全更重要。 但我不知道哪個更安全,也許SqlDataReader是。

我是中國人,所以也許我的話是不正確的語法,對不起。