Atul Rokade Ответов: 3

Почему обновление запроса не работает?


Всем привет,

Я создаю одно приложение, где если использовать enter valid unique_no, то его продажи подсчитываются, код выполняется нормально, но когда я вижу таблицу, поле не обновляется
база данных im создана в access

Схема таблиц такова

Функция User_id Счетчик
Текст Имени Пользователя
Напоминание Пароля
Количество Unique_No
Sales_count Количество
To_Date Дата/Время

Что я уже пробовал:

private void button1_Click_1(object sender, EventArgs e)
       {
           this.txtinput.MaxLength = 4;


           cmd = new OleDbCommand("update Login set Sales_count=Sales_count+1 where [Unique_No]=@Unique_No", con);
               cmd.Parameters.AddWithValue("@Unique_No", txtinput.Text);


               con.Open();
               int n = cmd.ExecuteNonQuery();

               if (n==0)
               {
                   MessageBox.Show("Invalid Unique No. pls try again later");
                   this.DialogResult = DialogResult.Cancel;
               }
               else
               {
                   this.DialogResult = DialogResult.OK;
               }


               con.Close();
           }


он работает нормально, но данные не обновляются в таблице
Примечания : прямо сейчас поле Sales_count пусто
---------------------------------------------------------------

тоже когда я попробовал ниже код
update Login set Sales_count=Sales_count+1 where [Unique_No]=@Unique_No and [To_Date]='" + DateTime.Now.ToShortDateString() + "'", con


debgugger когда к ниже линии
if (n==0)
           {
               MessageBox.Show("Invalid Unique No. pls try again later");
              this.DialogResult = DialogResult.Cancel;
           }

Richard Deeming

... and [To_Date]='" + DateTime.Now.ToShortDateString() + "'"

НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]

Вы уже знаете, как использовать параметры из вашего предыдущего примера.

3 Ответов

Рейтинг:
12

ZurdoDev

Проблема с вашим кодом заключается в следующем: вы написали: "прямо сейчас поле Sales_count пусто." Что такое blank +1? пустой. Если вы не видите, что ваша база данных пуста, это, скорее всего, ноль. Null +1-это все равно null. Следовательно, никаких ошибок, но и никаких данных, похоже, не меняется.

Очень простое исправление:

set Sales_count=IsNull(Sales_count, 0)+1


Это означает, что если Sales_count имеет значение NULL, то функция isnull возвращает 0, так что добавление 1, то будет работать.


Atul Rokade

Привет @RyanDev : это дает мне исключение неправильное количество аргументов, используемых с функцией в выражении запроса ' IsNull(Sales_count, 0)+'. примечание: Я использую ms access в качестве поставщика базы данных=Microsoft. ACE.OLEDB. 12. 0

ZurdoDev

Вам нужно измениться, чтобы использовать IIF.

Что-то вроде Set Sales_count = IIF(IsNull(Sales_count), 0, Sales_count) + 1

Atul Rokade

@RyanDev: sir its working fine sir :) только одна помощь мне нужна, как я ввожу системную дату в базу данных access, которую я использую [To_Date]='" + DateTime.Now.Тошортдатестринг () + в запросе, но он дает мне недопустимую ошибку, как я могу поместить системную дату в базу данных access при обновлении этого?

ZurdoDev

Я считаю, что Access хочет # вокруг дат, а не одинарных кавычек. Если это не сработает, просто сделайте быстрый поиск в google, чтобы узнать, как поместить даты в msaccess.

Atul Rokade

thnx RyanDev за Вашу поддержку

ZurdoDev

Пожалуйста.

Рейтинг:
0

P_Z

Привет,

Я думаю, что код можно улучшить, разделив пользовательский интерфейс, бизнес-логику и запросы к базе данных.

Что касается проверки ввода из пользовательского интерфейса на входе (проверки на стороне клиента, например, с помощью JavaScript/jQuery) и при нажатии кнопки (проверки на стороне сервера, например, с помощью C#), вы должны проверить ввод как txtinput.Текст может не совпадать с типом поля в базе данных.

Из схемы таблицы неясно, что такое PK...есть User_ID и Unique_No

Похоже, вам не хватает связи с dbcommand:
Объект oledbcommand.Свойство Соединения (Системы.Данных.Для oledb)[^]

cmd.Connection = con;


Также может быть лучше использовать try catch, чтобы проверить наличие каких-либо ошибок. Ошибка не всегда может быть недопустимой.
try
{
   ...database related code
}
catch(Exception ex)
{
   //handle Exception here
}
finally{
   con.Close(); //this always ensures to close the connection
}


Рейтинг:
0

Member 10261484

cmd = new OleDbCommand("update Login set Sales_count= 
case when Sales_count='' then (select Sales_count from Login where [Unique_No]=@Unique_No )+1 else (select Sales_count from Login where [Unique_No]=@Unique_No )+1 end
 where [Unique_No]=@Unique_No", con);


Atul Rokade

Привет член 10261484: thnx для ответа, но он дает мне синтаксическую ошибку (отсутствует оператор) в выражении запроса "case when Sales_count=" then (select Sales_count from Login where [Unique_No]=@Unique_No) +1 else (select Sales_count from Login where [Unique_No]=@Unique_No) +1 end".