Преобразование не удалось при преобразовании даты и времени из строки символов - PullRequest
0 голосов
/ 04 января 2011

Я пытаюсь прочитать данные из 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>();*/
    }

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

Ответы [ 2 ]

6 голосов
/ 04 января 2011

Убейте 2 зайцев одним выстрелом и параметризируйте ваш 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);

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

1 голос
/ 04 января 2011

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

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);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...