Methoun Ahmed Ответов: 2

Как показать результат текстового поля перед сохранением базы данных


con.Open();
              SqlCommand cmd = new SqlCommand("INSERT INTO tblPurchase (Pur_No,Bill_Challan_No,Pur_Date,Sup_Name,Item_Name,Qty,Rate,Total)VALUES('" + textBox1.Text + "','" + textBox2.Text + "','" + dateTimePicker1.Value.ToString("MM/dd/yyyy") + "','" + textBox6.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','" + textBox5.Text + "','" + textBox7.Text + "')", con);
              cmd.ExecuteNonQuery();
              MessageBox.Show("Purchase Succesfully", "Successfully", MessageBoxButtons.OK, MessageBoxIcon.Information);
              Gridview();
              con.Close();


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

Я хочу показать результат перед сохранением базы данных в поле Total.
Как Количество*Цена=Сумма

NotPolitcallyCorrect

"Я хочу показать результат перед сохранением базы данных в поле Total", хорошо, так что продолжайте и делайте это, если это то, что вы хотите сделать. Вас ничто не остановит. Однако что может вас остановить, так это приглашение к атаке SQL-инъекции, которое вы там закодировали.

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Так в чем же проблема?

2 Ответов

Рейтинг:
17

OriginalGriff

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

using (SqlCommand cmd = new SqlCommand("INSERT INTO tblPurchase (Pur_No,Bill_Challan_No,Pur_Date,Sup_Name,Item_Name,Qty,Rate,Total)VALUES(@PN, @BCN, @PD, @SN, @IN, @QTY, @RA, @TOT), con))
   {
   cmd.Parameters.AddWithValue("@PN", textBox1.Text);
   cmd.Parameters.AddWithValue("@BCN", textBox2.Text);
   cmd.Parameters.AddWithValue("@PD", dateTimePicker1.Value);
   cmd.Parameters.AddWithValue("@SN", textBox6.Text);
   cmd.Parameters.AddWithValue("@IN", textBox3.Text);
   cmd.Parameters.AddWithValue("@QTY", textBox4.Text);
   cmd.Parameters.AddWithValue("@RA", textBox5.Text);
   cmd.Parameters.AddWithValue("@TOT", textBox7.Text);
   cmd.ExecuteNonQuery();
   ...

Но даже тогда это плохо. Вместо этого ваши текстовые поля должны быть изменены на значения с помощью методов TryParse и сначала сообщены пользователю об ошибках.
int qty;
if (!int.TryParse(textBox4.Text, out qty))
   {
   ... report problem to user
   return;
Если вы сделаете это для всех числовых значений, то ваша проблема отображения (или просто проверки) того количества раз, которое равно сумме, станет тривиальной - вы уже знаете, как это сделать.

Кстати: сделайте себе одолжение и перестаньте использовать имена Visual Studio по умолчанию для всего - вы можете помнить, что" TextBox8 " - это номер мобильного телефона сегодня, но когда вам придется изменить его через три недели, вы тогда это сделаете? Используйте описательные имена - например, "tbMobileNo" - и ваш код станет легче читать, более самодокументируемым, более легким в обслуживании-и на удивление быстрее кодировать, потому что Intellisense может добраться до" tbMobile "за три нажатия клавиш, где" TextBox8 " занимает размышление и 8 нажатий клавиш...


Methoun Ahmed

Пожалуйста, покажите полный код

инт кол-во;
если (! int.TryParse(textBox4. Text, out qty))
{
... сообщение для пользователя
вернуть;

OriginalGriff

Я не могу показать вам, как сообщить о проблеме пользователю: я понятия не имею, в какой среде вы работаете! :смеяться:
Как бы вы обычно сказали пользователю: "это недопустимый ввод" в вашем коде?

Рейтинг:
0

Wendelius

Как указал OriginalGriff, всегда используйте параметры. Одна из причин заключается в том, чтобы быть в безопасности от SQL-инъекций, но есть еще несколько вещей, которые вы должны отметить

- на данный момент Вы полагаетесь на неявные преобразования по дате и числовым значениям. Например, что произойдет, если формат даты по умолчанию для базы данных не MM/dd/yyyy, ваше преобразование из dateTimePicker1.Value.ToString ("MM/dd/yyyy") завершится ошибкой. То же самое происходит, например, если в ставку вводится 1,5.
- вы вообще не изучаете ошибки, у вас должны быть правильные блоки try..catch для обработки распространенных ошибок, например уникальных нарушений ограничений
- вы не распоряжаетесь предметами. Самый простой способ-использовать блоки в коде, чтобы обеспечить правильное использование ресурсов

Для решения проблем, упомянутых выше, взгляните на Правильное выполнение операций с базой данных[^]

А теперь что же происходит Total поле, я бы вообще не обязательно использовал такую колонку. Если total вычисляется на основе qty * Rate, я бы вместо этого создал вычисляемый столбец в таблице. В настоящее время, если изменяется количество или ставка, вам всегда нужно соответствующим образом обновить поле итог. Кроме того, вы должны убедиться, что итог не может быть отредактирован; в противном случае количество и скорость не имели бы смысла.

Наличие вычисляемого столбца решает эти проблемы, вы всегда обновляете исходные значения, и вычислительное значение всегда корректно на основе значений материнских столбцов и доступно только для чтения. Для получения дополнительной информации взгляните на Укажите вычисляемые столбцы в таблице[^]