2016-05-25 2 views
0

В ответ на предыдущий вопрос here, мне также посоветовали также задать вопрос об этой связанной проблеме.Почему я получаю «тайм-аут» и «Не могу найти таблицу 0» и какие превентивные меры имеются в моем распоряжении?

Через некоторое время в коде генерации отчетов у меня есть два исключения (они не отображаются пользователю, и они думают, что все это hunky dory), но я получаю их по электронной почте мне.

Первый, «Время ожидания истекло. Время ожидания истекло до завершения операции или сервер не отвечает.»

... и тот, который всегда следует быстро после этого есть " не можете найти таблицу 0 «

Первое сообщение Exeption полагает, что последняя строка кода в разделе Ьгу (» новый SqlDataAdapter (CMD) .Нанести (Ds); ") в приведенном ниже метод бросает исключение:

public static DataTable ExecuteSQLReturnDataTable(string sql, 
    CommandType cmdType, params SqlParameter[] parameters) 
{ 
    using (var ds = new DataSet()) 
    { 
     using (var connStr = new SqlConnection(CPSConnStr)) 
     { 
      using (var cmd = new SqlCommand(sql, connStr)) 
      { 
       cmd.CommandType = cmdType; 
       cmd.CommandTimeout = EXTENDED_TIMEOUT; 
       foreach (var item in parameters) 
       { 
        cmd.Parameters.Add(item); 
       } 

       try 
       { 
        cmd.Connection.Open(); 
        new SqlDataAdapter(cmd).Fill(ds); 
       } 
       catch (Exception ex) 
       { 
        RoboReporterConstsAndUtils.HandleException(ex); 
       } 
       return ds.Tables[0]; 
      } 
     } 
    } 
} 

Второе сообщение об исключении утверждает, что оно исходит из последней значимой строки в вышеописанном методе («return ds.Tables [0]; «), а также это один:

var dtFillRateResults = 
    RoboReporterSQL.ExecuteSQLReturnDataTable 
     (FILL_RATE_BY_DISTRIBUTOR_BY_CUSTOMER_STORED_PROC, 
     CommandType.StoredProcedure, 
      new SqlParameter() 
      { 
       ParameterName = "@Unit", 
       SqlDbType = SqlDbType.VarChar, 
       Value = _unit 
      }, 
      new SqlParameter() 
      { 
       ParameterName = "@Member", 
       SqlDbType = SqlDbType.VarChar, 
       Value = _memberId 
      }, 
      new SqlParameter() 
      { 
       ParameterName = "@BegDate", 
       SqlDbType = SqlDbType.DateTime, 
       Value = Convert.ToDateTime(_dateBegin) 
      }, 
      new SqlParameter() 
      { 
       ParameterName = "@EndDate", 
       SqlDbType = SqlDbType.DateTime, 
       Value = Convert.ToDateTime(_dateEnd) 
      } 
    ); 

FILL_RATE_BY_DISTRIBUTOR_BY_CUSTOMER_STORED_PROC является ХП, который используется в других местах и ​​до моих усилий и деятельности здесь, так что это не сам SP, что вызывает проблему

.

Для супер-любопытно, сделанный на заказ вызова метода из приведенной выше коды:

public static DataTable ExecuteSQLReturnDataTable(string connectionStr,  
    string sql, CommandType cmdType, params SqlParameter[] parameters) 
{ 
    using (var ds = new DataSet()) 
    { 
     using (var connStr = new SqlConnection(connectionStr)) 
     { 
      using (var cmd = new SqlCommand(sql, connStr)) 
      { 
       cmd.CommandType = cmdType; 
       cmd.CommandTimeout = EXTENDED_TIMEOUT; 
       foreach (var item in parameters) 
       { 
        cmd.Parameters.Add(item); 
       } 

       try 
       { 
        cmd.Connection.Open(); 
        new SqlDataAdapter(cmd).Fill(ds); 
       } 
       catch (Exception ex) 
       { 
        RoboReporterConstsAndUtils.HandleException(ex); 
        return null; 
       } 
       return ds.Tables[0]; 
      } 
     } 
    } 
} 

ответ

1

ошибки, потому что заливка или открытая часть здесь

try 
{ 
    cmd.Connection.Open(); 
    new SqlDataAdapter(cmd).Fill(ds); 
} 

is time out, но поскольку вы обрабатываете исключение, выполнение заканчивается удалением оператора return, в котором вы пытаетесь вернуть таблицу из таблицы нулевой таблицы набора данных.

Таймаут может случиться по многим причинам. Вероятно, вам нужно больше информации для этого, но если вы используете профилировщик sql в студии управления, вы должны иметь представление о том, открывается ли соединение, вызвано ли proc, сколько времени он пытается запустить и какая часть вызывает таймаут. Если он работает в другом месте, запишите свои входные параметры и попробуйте их напрямую.

Также установка тайм-аута 0 должна дать вам максимально возможное.

Смежные вопросы