2010-05-14 64 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是。

我是中国人,所以也许我的话是不正确的语法,对不起。