2016-09-28 2 views
-1

Я пытаюсь запустить запрос, который выбирает все из таблицы, содержащей DateTime. В DateTime, он использует переменную DateTime (аргумент, переданный через параметр), однако это дает мне это исключение:Выбор SQL DateTime с переменной C# DateTime

"FormatException был необработанное Необработанное исключение типа„System.FormatException“произошло в mscorlib.dll Дополнительная информация: строка не была признана в качестве действительного DateTime»

Solutions Я пытался, но не получилось:

  • Преобразование DateTime в строку
  • Преобразование DateTime в строку с правильным форматом, а затем обратно в DateTime снова
  • Используйте метод DateTime.Parse
  • Используйте метод DateTime.ParseExact с правильным форматом и использованием как «CultureInfo.InvariantCulture» и " CreateSpecificCulture («ан-ГБ»)
  • Измените формат точно такой же отображается при выполнении запроса в базе данных

Как уже говорилось, ни одно из вышеперечисленного не работали ..

  • Формат Я пытаюсь использовать: "MM/DD/YYYY 00:00:00"
  • Формат показан при выполнении запроса в базе данных: "MM/DD/YYYY чч: мм: сс: FFF" (время должно быть установлено в 00:00:00)

Вот код, с помощью соединительного материала исключены:

cmd = new SqlCommand("SELECT * FROM Arithmetics " 
        + "INNER JOIN ArithmeticsAndTypeIDs " 
        + "ON Arithmetics.ArithmeticID = ArithmeticsAndTypeIDs.ArithmeticsID " 
        + "INNER JOIN ArithmeticTypes " 
        + "ON ArithmeticsAndTypeIDs.TypeID = ArithmeticTypes.TypeID " 
        + "WHERE UserID = @value1 " 
        + "AND TimeStamp >= '@value2' " 
        + "AND TimeStamp <= '@value3'", con); 
       cmd.Parameters.AddWithValue("@value1", GetUserID(userLoggedIn)); 
       cmd.Parameters.AddWithValue("@value2", DateTime.ParseExact(time.ToString(), formatString, CultureInfo.CreateSpecificCulture("en-GB").DateTimeFormat)); 
       time = time.AddDays(1); 
       cmd.Parameters.AddWithValue("@value3", DateTime.ParseExact(time.ToString(), formatString, CultureInfo.CreateSpecificCulture("en-GB").DateTimeFormat)); 

проблема первая происходит в строке: «+» AND TimeStamp> = '@ value2' ""

* И если это имеет значение, вот цитата, которую я использую в базе данных, где obv. работы (с переменными заменяются значениями заполнителей)

SELECT * FROM Arithmetics 
    INNER JOIN ArithmeticsAndTypeIDs 
    ON Arithmetics.ArithmeticID = ArithmeticsAndTypeIDs.ArithmeticsID 
    INNER JOIN ArithmeticTypes 
    ON ArithmeticsAndTypeIDs.TypeID = ArithmeticTypes.TypeID 
    WHERE UserID = 0 
    AND 
    ArithmeticTypes.TypeID = 2 
    AND TimeStamp >= '09-21-2016 00:00:00' 
    AND TimeStamp <= '09-22-2016 00:00:00' 

Следует отметить, что «@ значение2» содержит значение («09-21-2016 00:00:00») (при условии, что это дата который передается как параметр), поэтому я знаю, что форматирование верное.

Любая помощь в направлении исправления этой проблемы было бы весьма признателен :)

+1

Удалить единственную цитату 'in' @ value2 '=> '" AND TimeStamp> = @ value2 "'. И в @ value3 также – Pikoh

+0

Добавление одинарных кавычек вокруг заполнитель-указатель параметра преобразует его в литеральной строке и, конечно, нет способа рассмотреть строку «@ value1», поскольку это была дата – Steve

+0

О, так что попробуйте преобразовать «@ value2 "в datetime? Это кажется таким логичным сейчас ... Спасибо! Как я могу обойти это без открытия инъекций SQL? – Sprouze

ответ

0

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

WHERE UserID = @value1 AND TimeStamp BETWEEN @value2 and @value3 

Значения параметров должны быть переданы без какого-либо преобразования в строку:

cmd.Parameters.AddWithValue("@value1", GetUserID(userLoggedIn)); 
cmd.Parameters.AddWithValue("@value2", time); 
cmd.Parameters.AddWithValue("@value3", time.AddDays(1)); 

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

Вы также избегаете проблем внедрения SQL, поскольку значения параметров никогда не являются частью запроса. Даже строковые переменные рассматриваются как только текст, они никогда не являются частью запроса.

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