Недавно я рекомендовал коллеге заменить код C #, использующий утилиту командной строки sqlcmd, на SqlDataReader. Старый код использует:
System.Diagnostics.ProcessStartInfo procStartInfo =
новый System.Diagnostics.ProcessStartInfo ("cmd", "/ c" + sqlCmd); где sqlCmd что-то вроде
"sqlcmd -S" + имя_сервера + "-y 0 -h-1 -Q" + "\" "+" ИСПОЛЬЗОВАНИЕ ["+ база данных +"] "+"; + 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? Я действительно удивлен, тем более что подход с использованием командной строки предполагает запуск процесса. Я действительно думал, что это будет медленнее.
Есть мысли?
Спасибо,
Dave