2011-01-04 3 views
0

Я пытаюсь читать данные с SQL Server 2005 и заполнять их в TableAdapter (также пытался использовать DataReader), но я все время получаю это исключение. Дело в том, что я получаю эту ошибку в некоторых системах, то есть я запускаю мое приложение в режиме с чипом, но в другой системе я получаю это исключение.Ошибка конверсии при преобразовании даты и времени из символьной строки

Кодекс:

public DataSetRef GetReportPumpControl(PumpInfo pump, DateTime start, DateTime end) 
    { 
     if (!OpenConnection()) 
      return null; 

     m_Command.CommandText = "SELECT ref_dig_pumpcontrol, ref_energy, ref_datetime FROM [molisoftSchema].[Refresh] WHERE ref_pump_id = " + pump.ID + " AND ref_datetime BETWEEN '" + start + "' AND '" + end + "' ORDER BY ref_datetime ASC"; 

     SqlDataAdapter adapter = new SqlDataAdapter(m_Command); 
     DataSetRef ds = new DataSetRef(); 
     adapter.Fill(ds, "RefreshPC"); 

     return ds; 

     /*m_Reader = m_Command.ExecuteReader(); 

     LinkedList<PumpControlInfo> returnValue = new LinkedList<PumpControlInfo>(); 
     while (m_Reader.Read()) 
     { 
      PumpControlInfo tempControl = new PumpControlInfo(); 
      tempControl.DateTime = (DateTime)m_Reader["ref_datetime"]; 
      tempControl.Energy = (double)m_Reader["ref_energy"]; 
      tempControl.PumpControl = (bool)m_Reader["ref_dig_pumpcontrol"]; 

      returnValue.AddLast(tempControl); 
     } 
     m_Reader.Close(); 
     return returnValue.ToArray<PumpControlInfo>();*/ 
    } 

Пожалуйста, помогите мне с этим вопросом. Спасибо заранее!

ответ

1

Вы должны установить свои значения запроса как параметры, а не просто использовать конкатенацию строк (и с ним неявное преобразование). Попробуйте:

m_Command.CommandText = "SELECT ref_dig_pumpcontrol, ref_energy, ref_datetime FROM [molisoftSchema].[Refresh] WHERE ref_pump_id = @id AND ref_datetime BETWEEN @start AND @end ORDER BY ref_datetime ASC"; 
m_Command.Parameters.AddWithValue("@id", pump.ID); 
m_Command.Parameters.AddWithValue("@start", start); 
m_Command.Parameters.AddWithValue("@end", end); 

Помимо того, что лучше практиков в целом, это будет использовать свойство преобразования на месте в параметрах, которые лучше предназначены для такого рода вещей, чем неявное преобразование строковога строки.

6

убить 2 птиц с 1 камнем и параметризации вашего SQL (будет охранять вас от атак пути внедрения SQL):

m_Command.CommandText = "SELECT ref_dig_pumpcontrol, ref_energy, ref_datetime FROM [molisoftSchema].[Refresh] WHERE ref_pump_id = @pumpid AND ref_datetime BETWEEN @StartDate AND @EndDate ORDER BY ref_datetime ASC"; 

m_Command.Parameters.AddWithValue("@pumpid", pump.ID); 
m_Command.Parameters.AddWithValue("@StartDate", start); 
m_Command.Parameters.AddWithValue("@EndDate", end); 

Проблема была, потому что начальные значения .NET и конца DateTime являются сериализациями в строку с «жесткий код» в SQL, который вы генерировали. Однако это строковое представление не может быть переведено обратно в действительное время datetime в SQL (вам нужно использовать формат даты SAFE, такой как yyyy-MM-ddTHH: mm: ss - так явно форматировать эти DateTimes перед добавлением в инструкцию SQL) , Однако параметризация - это гораздо лучшее решение, которое обходит эти проблемы.

+0

Заранее спасибо, это сработало! – Moh