Синтаксическая ошибка при выполнении команды SQL в C#

avatar
hamid jalil
8 апреля 2018 в 06:12
68
1
-2
cmd = new SqlCommand("Select Max(Date_Time) From Daily_Sale ", con); cmd.ExecuteNonQuery();
string date_tim = (string)cmd.ExecuteScalar();
MessageBox.Show("date time" + date_tim);

Это показывает дату и время в окне сообщения, но когда я вызываю этот запрос:

cmdc = new SqlCommand("Select Total_Sale from Daily_Sale Where Date_Time ="+ date_tim,con);
cmdc.ExecuteNonQuery();

Я получаю синтаксическую ошибку.

Date_Time сохраняется как nvarchar(50).

Источник
rahulaga_dev
8 апреля 2018 в 06:20
0

Вы можете попробовать "Select Total_Sale from Daily_Sale Where Date_Time ="+ " ' " + date_tim + " ' ",con?

AnuPrasad
8 апреля 2018 в 06:26
0

попробуйте так..cmdc = new SqlCommand("Выберите Total_Sale из Daily_Sale, где Date_Time = ' "+ date_tim+" ' ",con);

Gerard H. Pille
8 апреля 2018 в 06:34
6

Вы советуете ему продолжать конкатенацию? Вы здорово помогаете, ребята. Вы когда-нибудь слышали о подготовленном заявлении?

hamid jalil
8 апреля 2018 в 06:39
0

да, это работает, но это запрос int sale_pre = (int)cmdc.ExecuteScalar(); дает ссылку на объект ошибки, не установленную для экземпляра объекта. в то время как когда я был запущен, они запрашивают («выберите Totale_Sale из Daily_sale»), это дает значение

Zohar Peled
8 апреля 2018 в 06:57
4

Date_Time сохраняется в nvarchar(50). Почему? Это может вызвать у вас только проблемы. Никогда не храните дату и время в виде строк. Вместо этого используйте DateTime2.

marc_s
8 апреля 2018 в 06:57
2

SQL Injection предупреждение - вы должны не конкатенация вместе ваши заявления SQL - использование параметризованных запросов вместо, чтобы избежать инъекции SQL - проверить Маленький Бобби Таблицы

Ответы (1)

avatar
Zohar Peled
8 апреля 2018 в 07:05
2

Во-первых, вам нужно использовать параметры для отправки данных в SQL. Никогда не объединяйте строки данных с оператором SQL. Это дыра в безопасности, так как это открытая дверь для атак SQL Injection.
Для получения дополнительной информации прочитайте Как подготовленные операторы могут защитить от атак путем внедрения кода SQL? и Microsoft Docs - Как выполнять параметризованные запросы

Во-вторых, никогда не храните даты в виде строк в своей базе данных. Для значений только даты используйте тип данных Date. Для значений только времени используйте тип данных Time. Для значений даты и времени используйте тип данных DateTime2 (почему бы не использовать DateTime?).
Для получения дополнительной информации прочитайте статью Аарона Бертрана Плохие привычки: выбор неправильного типа данных и мой ответ на SO на этот вопрос.<1840977434097>

В-третьих, вам не нужно два запроса, чтобы получить последнее значение total_sale из базы данных. Вы можете сделать это в одном запросе вообще без каких-либо параметров:

SELECT TOP 1 Total_Sale
FROM Daily_Sale 
ORDER BY Date_Time DESC

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

SELECT TOP 1 Total_Sale, Date_Time 
FROM Daily_Sale 
ORDER BY Date_Time DESC

hamid jalil
8 апреля 2018 в 10:28
0

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

Zohar Peled
8 апреля 2018 в 10:46
0

Рад помочь :-)