我最近向一位同事提倡我们用一个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快吗?我真的很惊讶,特别是因为命令行实用程序方法涉及启动一个过程。我真的认为它会变慢。
有什么想法?
谢谢, 戴夫
'//做东西w/reader'可能很重要。那里有什么? – 2010-05-14 03:23:47
20-40%显着吗?我们是否正在谈论一个过程,其中一个需要500毫秒,另一个需要600毫秒?或者是几秒钟或更长时间? – 2010-05-14 03:25:19
山姆,这是300的差别左右与350至600(取决于谁在做测试,我相信我读了人类无法察觉不到200毫秒所以有一些担忧。 该数据在被检索点击用户点击“显示结果”按钮,在此之前很难获取数据,因为他可能会改变它直到最后一刻 坦率地说,我很惊讶SQLDataReader不是那么快或更快,但请参阅TimLi的回答(DataReader也获取模式信息)。do stuff/w阅读器速度极快(<15毫秒)。 谢谢 – Dave 2010-05-14 22:45:56