У нас есть отчет, который дает нам серьезные проблемы, поэтому я решил поместить его в консольное приложение для устранения проблем.
Отчет представляет собой простой выбор SQL, возвращающий приблизительно 25 столбцов,
и наш диапазон дат может составлять 3-6 месяцев, возвращая около 10 тыс. строк, поэтому мы не говорим о большом количестве данных.
Вот что происходит, когда отчет запускается, время ожидания с нашего веб-сайта, в консоли, для завершения требуется где-то от 13-18 минут, кажется, что ожидание происходит на
da.Fill(ds);
Теперь это странная вещь: она запускается приблизительно в течение 1-3 секунд в среде SQL Server Management Studio, и когда наши разработчики Delphi создают подобное приложение, запускается также несколько секунд, это происходит только с использованием .NET
Мы попытались перейти от набора данных к загрузке в хранилище данных,
используя этот код ..
using (var dr = _command.ExecuteReader())
{
if (dr.HasRows)
{
int i = 0;
while (dr.Read())
{
var startRead = DateTime.Now;
Console.Write("{2}\t{0}\t{1}\t", dr.GetInt32(0), dr.GetString(1), i);
var tookRead = DateTime.Now.Subtract(startRead);
Console.WriteLine("Took: " + tookRead);
i++;
}
}
Однако это совсем не помогло, оно просто отображается в чанках, но имеет частые задержки. Я думаю, что это SQL, но не могу объяснить, почему он отлично работает в Delphi и в SQL Management Studio.
Я пытался использовать .NET 2.0, 3.5 и 4, происходит на всех платформах.
Вот мой код
public static DataSet GetData()
{
var now = DateTime.Now;
var _command = new SqlCommand();
var _connection = new SqlConnection();
try
{
_connection.ConnectionString = connectionString;
_command.Connection = _connection;
_command.CommandText = storedProcedure;
_command.CommandType = CommandType.StoredProcedure;
_command.CommandTimeout = 60;
if (string.IsNullOrEmpty(_connection.ConnectionString)) { throw new Exception("Connection String was not supplied"); }
_command.Parameters.Add(new SqlParameter("DateFrom", dateFrom));
_command.Parameters.Add(new SqlParameter("DateTo", dateTo));
SqlDataAdapter da;
var ds = new DataSet();
_connection.Open();
var done = DateTime.Now;
da = new SqlDataAdapter(_command);
da.Fill(ds);
if (ds == null) { throw new Exception("DataSet is null."); }
if (ds.Tables.Count == 0) { throw new Exception("Table count is 0"); }
var took = done.Subtract(now);
return ds;
}
catch (Exception ex)
{
File.WriteAllText(Path.Combine(Application.StartupPath, String.Format("Exception{0:MMddyyyy_HHmmss}.log", DateTime.Now)), ex.ToString());
}
finally
{
if (_connection.State != ConnectionState.Closed) { _connection.Close(); }
}
return null;
}
Есть идеи? Наш администратор баз данных обвиняет фреймворк, я на самом деле обвиняю что-то в SQL .. (может быть, статистика или поврежденная база данных)