我最近向一位同事提倡我们将一些使用 sqlcmd 命令行实用程序的 C# 代码替换为 SqlDataReader。旧代码使用: System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", "/c" + sqlCmd); sqlCmd 类似于 "sqlcmd -S " + serverName + " -y 0 -h-1 -Q " + "\"" + "USE [" + database + "]" + ";+ txtQuery.Text +"\ "";\
然后使用正则表达式解析结果。我认为使用 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 快吗?我真的很惊讶,特别是因为命令行实用程序方法涉及启动一个进程。我真的以为它会更慢。
有什么想法吗?
谢谢,戴夫