Member 13264296 Ответов: 1

Как я решаю "значение не может быть нулевым именем параметра: 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

- Спасибо, сэр. Это очень помогает мне, как новичку в этом программировании.

1 Ответов

Рейтинг:
1

Patrice T

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь уязвимости под названием "SQL injection", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользователь вводит имя типа "Брайан О'Коннер", это может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]


Member 13264296

спасибо за совет, я действительно этого не знаю. В моем коде выше мне нужно сохранить все данные из datagridview в мою базу данных. Как лучше всего это сделать?

Member 13264296

Тем не менее SQL-инъекция может атаковать автономную систему? или просто настольная система.

Patrice T

SQL-инъекция-это вредоносный пользовательский ввод, атакующий вашу базу данных SQL.

Member 13264296

Можете ли вы привести мне пример безопасного запроса и избежать SQL-инъекции?

Patrice T

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