Как я решаю "значение не может быть нулевым именем параметра: string"
Dim code As String Dim name As String Dim category As String Dim size As String Dim productprice As Decimal Dim sellingprice As Decimal Dim count As String Dim totalsales As Decimal Dim stock As String Dim newstocks As String Dim pinvoice As String For i = 0 To DGVReceipt.Rows.Count - 1 code = DGVReceipt.Rows(i).Cells(0).Value name = DGVReceipt.Rows(i).Cells(1).Value category = DGVReceipt.Rows(i).Cells(2).Value size = DGVReceipt.Rows(i).Cells(3).Value productprice = Decimal.Parse(DGVReceipt.Rows(i).Cells(4).Value) sellingprice = Decimal.Parse(DGVReceipt.Rows(i).Cells(5).Value) count = DGVReceipt.Rows(i).Cells(6).Value totalsales = Decimal.Parse(DGVReceipt.Rows(i).Cells(7).Value) stock = DGVReceipt.Rows(i).Cells(8).Value newstocks = DGVReceipt.Rows(i).Cells(9).Value pinvoice = DGVReceipt.Rows(i).Cells(10).Value next MyNonQuery(String.Format("insert into boyscout_pos.tbltransaction(Purchase_Invoice,Receipt_No,Date,Product_Code,Product_Name,Category,Size,Product_Price,Selling_Price,Stock_Out,Total) values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}')", pinvoice, receiptNo.Text, transactiondate.Text, code, name, category, size, productprice, sellingprice, count, totalsales))
Что я уже пробовал:
1-е вещи 1-е, у меня были данные, что значение цены как (250,75). Я хочу сохранить его в своей базе данных mysql, поэтому конвертируйте productprice & sellingprice так, как описано выше, но в действительности. Я столкнулся с предупреждением "значение не может быть нулевым именем параметра: String".
Как я это решил.
Richard Deeming
В дополнение к уязвимости SQL-инъекции в вашем коде вы выполняете только запрос после петля закончилась. Это означает, что вы всегда будете вставлять в свою таблицу только значения из последней строки.
Вам нужно выполнить запрос внутри то For
петля.
И если вам нужна помощь, чтобы исправить исключение, вам нужно будет сказать нам, из какой строки вашего кода оно выбрасывается.
Member 13264296
Извините за это,в моем коде здесь запрос находится внутри цикла, публикуя ошибку. Исключение происходит внутри цикла for, потому что если я не буду преобразовывать productprice и sellingprice в десятичную дробь, то в программе нет предупреждающего исключения и работает нормально, но в результате этого в базе данных mysql есть существующая строка в последней строке с пустыми другими полями и значением 0 в поле Product_Price и Selling_Price.
Richard Deeming
Похоже, что в нижней части вашей сетки есть пустая строка "вставить", и вы пытаетесь вставить пустые значения из нее в базу данных. Попробуйте исключить эту строку:
For i = 0 To DGVReceipt.Rows.Count - 2
Member 13264296
Спасибо, он хорошо работает. Можете ли вы объяснить, почему мои коды уязвимы от SQL-инъекции? Мне трудно понять, как это происходит с моими кодами. На самом деле, что данные, которые практическое руководство название: DGVReceipt с другой окно, я его вытащу оттуда.
Как я получаю данные?
Через сканирование там код продукта и временно хранится в datagridview 1-го окна формы, а затем передать его в следующее окно datagridview с именем: DGVReceipt и в коде выше мне нужно сохранить данные в моей базе данных с помощью запроса.
Richard Deeming
Попробуй сходить receiptNo
и печатаю на машинке 1','2','3','4','5','6','7','8','9','10'); DELETE FROM boyscout_pos.tbltransaction; --
, а затем нажмите кнопку.
Вы почти наверняка увидите, что все данные удалены из вашей таблицы.
Если вы не можете понять, почему, попробуйте это интерактивная демонстрация SQL-инъекций[^].
Member 13264296
Я видел демо. Я многому научился у него ... Спасибо...но в квитанции нет.Текст представляет собой метку и автоматически увеличивается. Мы не можем вставить этот запрос.
Member 13264296
Я устал менять свои запросы, я сделал ловушку для специальных символов. Это хорошо? или плохо. хе-хе
Richard Deeming
Вы будете еще больше уставать, когда вам придется перестраивать свой сервер и базу данных каждые несколько часов, потому что 3-летний ребенок взломал его[^].
Или когда вам придется заплатить огромный штраф, потому что вы не смогли защитить данные своих клиентов.
Или когда недовольный сотрудник использует уязвимость, чтобы украсть большие суммы денег из вашей компании.
Единственное безопасное решение для предотвращения SQLi - это использование параметризованных запросов. В .NET, как правило, гораздо проще использовать параметризованные запросы, чем строить запрос с конкатенацией строк - вам не нужно беспокоиться об экранировании/белом списке / черном списке специальных символов,правильном форматировании нестроковых значений и т. д.
Member 13264296
ладно, спасибо, Ричард.Итак, как будут выглядеть параметризованные запросы в vb.net. Можете ли вы привести мне пример?
Richard Deeming
Using cmd As New SqlCommand("insert into boyscout_pos.tbltransaction(Purchase_Invoice, Receipt_No, Date, Product_Code, Product_Name, Category, Size, Product_Price, Selling_Price, Stock_Out, Total) values (@Purchase_Invoice, @Receipt_No, @Date, @Product_Code, @Product_Name, @Category, @Size, @Product_Price, @Selling_Price, @Stock_Out, @Total)", connection) cmd.Parameters.AddWithValue("@Purchase_Invoice", pinvoice) cmd.Parameters.AddWithValue("@Receipt_No", receiptNo.Text) cmd.Parameters.AddWithValue("@Date", transactiondate.Text) cmd.Parameters.AddWithValue("@Product_Code", code) cmd.Parameters.AddWithValue("@Product_Name", name) cmd.Parameters.AddWithValue("@Category", category) cmd.Parameters.AddWithValue("@Size", size) cmd.Parameters.AddWithValue("@Product_Price", productprice) cmd.Parameters.AddWithValue("@Selling_Price", sellingprice) cmd.Parameters.AddWithValue("@Stock_Out", count) cmd.Parameters.AddWithValue("@Total", totalsales) cmd.ExecuteNonQuery() End Using
Member 13264296
- Спасибо, сэр. Это очень помогает мне, как новичку в этом программировании.