nyt1972 Ответов: 2

Практическое руководство объекта не задана ссылка на экземпляр объекта


Уважаемые гуру,

Я пытаюсь вставить строки datagridview в таблицу mysql, используя приведенный ниже код vb.net но получая подвергнутую ошибке, не знаю, где я совершаю ошибку? пожалуйста, помогите

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

Try
           Dim product, qty, price, total, desc, billno As String
           For i As Integer = 0 To Me.DataGridView1.Rows.Count - 1
               If DataGridView1.RowCount > 0 AndAlso DataGridView1.CurrentRow IsNot Nothing Then
                   'datatype integer
                   product = Convert.ToInt32(Me.DataGridView1.Rows(i).Cells(1).Value.ToString())
                   'datatype double
                   qty = Convert.ToDouble(Me.DataGridView1.Rows(i).Cells(2).Value.ToString())
                   price = Convert.ToDouble(Me.DataGridView1.Rows(i).Cells(3).Value.ToString())
                   total = Convert.ToDouble(Me.DataGridView1.Rows(i).Cells(4).Value.ToString())
                   'datatype varchar
                   desc = Me.DataGridView1.Rows(i).Cells(5).Value.ToString()
               End If
               billno = txtbillno.Text
               sqL = "INSERT INTO `dailysale`(`billno`,`customer_id`, `product_id`, `qty`, `price`, `total`, `description`) VALUES('" & billno & ",''" & txtCustomer.Tag & "', '" & product & "', '" & qty & "', '" & price & "', '" & total & "', '" & desc & "')"
           Next
           sqL &= "INSERT INTO `customer_payments`(`customer_id`, `billno`, `cdate`, `bill_amount`, `paid_amount`, `discount`, `ret_amount`, `balance`) VALUES ('" &
           txtCustomer.Tag & "','" & txtbillno.Text & "','" & DateTimePicker1.Value & "','" & Convert.ToDouble(txtbill_amount.Text) & "','" & Convert.ToDouble(txtpaid_amount.Text) & "','" & Convert.ToDouble(txtdiscount.Text) & "','" & Convert.ToDouble(txtret_amount.Text) & "','" & Convert.ToDouble(txttotalbalance.Text) & "')"
           ConnDB()
           cmd = New MySqlCommand(sqL, conn)
           cmd.ExecuteNonQuery()

           MsgBox("New Bill successfully created.", MsgBoxStyle.Information, "Create Bill")
       Catch ex As Exception
           MsgBox(ex.ToString)
       Finally
           cmd.Dispose()
           conn.Close()
       End Try

[no name]

Сообщение об ошибке сообщает вам, в чем проблема и где она возникает.

nyt1972

'тип данных integer
продукт = конвертация.ToInt32(Мне.DataGridView1.Ряды(я).Клетки(1).Значение.Метод toString())
'тип данных integer
desc = для меня.DataGridView1.Ряды(я).Клетки(5).Значение.Метод toString()

Показать ошибку в этих двух строках

Richard MacCutchan

Строка (i) или ячейки(1) или (5) не существуют или содержат null.

nyt1972

Ячейки(1) содержат значение t и ячейки(5) тоже. но даже тогда получаю эту ошибку

Richard MacCutchan

Затем используйте свой отладчик, чтобы точно узнать, какой элемент является нулевым в данный момент. Здесь никто не сможет сделать это за тебя.

Richard MacCutchan

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

nyt1972

Изменил код на ниже, но теперь записи не хранятся в базе данных

Try
            ConnDB()
            cmd = New MySqlCommand(sqL, conn)
            For i As Integer = 0 To Me.DataGridView1.Rows.Count - 1
                sqL = "INSERT INTO `dailysale`(`billno`,`customer_id`, `product_id`, `qty`, `price`, `total`, `description`) VALUES('@billno','@custid''@product', '@qty', '@price', '@total', '@desc')"
                'datatype integer
                With cmd
                    .Parameters.Clear()
                    .Parameters.AddWithValue("@billno", txtbillno.Text)
                    .Parameters.AddWithValue("@custid", txtCustomer.Tag)
                    .Parameters.AddWithValue("@product", Me.DataGridView1.Rows(i).Cells(1).Value)
                    .Parameters.AddWithValue("@qty", Me.DataGridView1.Rows(i).Cells(2).Value)
                    .Parameters.AddWithValue("@price", Me.DataGridView1.Rows(i).Cells(3).Value)
                    .Parameters.AddWithValue("@total", Me.DataGridView1.Rows(i).Cells(4).Value)
                    .Parameters.AddWithValue("@desc", Me.DataGridView1.Rows(i).Cells(5).Value)
                End With
            Next
            sqL &= "INSERT INTO `customer_payments`(`customer_id`, `billno`, `cdate`, `bill_amount`, `paid_amount`, `discount`, `ret_amount`, `balance`) VALUES ('" &
            txtCustomer.Tag & "','" & txtbillno.Text & "','" & DateTimePicker1.Value & "','" & txtbill_amount.Text & "','" & txtpaid_amount.Text & "','" & txtdiscount.Text & "','" & txtret_amount.Text & "','" & txttotalbalance.Text & "')"

            cmd.ExecuteNonQuery()

            MsgBox("New Bill successfully created.", MsgBoxStyle.Information, "Create Bill")
        Catch ex As Exception
            MsgBox(ex.ToString)
        Finally
            cmd.Dispose()
            conn.Close()
        End Try

2 Ответов

Рейтинг:
2

OriginalGriff

Это одна из самых распространенных проблем, которые нам задают, и это также та, на которую мы меньше всего готовы ответить, но вы больше всего готовы ответить сами.

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, в котором вы держите ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень забавный вид, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего такого, что обычно делали бы, когда извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

Мы не можем сказать, потому что нас там не было, и, что еще важнее, мы даже не можем видеть вашу рубашку, не говоря уже о том, что находится в кармане!

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-и мы не можем увидеть ваш код, а тем более запустить его и узнать, что содержит null, когда это не должно быть.
Но вы можете - и Visual Studio поможет вам здесь. Запустите свою программу в отладчике, и когда она выйдет из строя, VS покажет вам строку, на которой она обнаружила проблему. Затем вы можете начать просматривать различные его части, чтобы увидеть, какое значение равно null, и начать просматривать свой код, чтобы выяснить, почему. Поэтому поставьте точку останова в начале метода, содержащего строку ошибки, и снова запустите программу с самого начала. На этот раз VS остановится перед ошибкой и позволит вам изучить, что происходит, пройдя через код, глядя на ваши значения.

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


nyt1972

С измененным кодом теперь он не показывает никаких ошибок, но записи не хранятся в базе данных

[no name]

Изучение того, как использовать отладчик для отладки кода, на самом деле не является необязательным навыком, который вы можете не изучать.

OriginalGriff

+5-если бы я мог. : большой палец: боюсь, придется обойтись.

[no name]

Спасибо. Не беспокойтесь. Не стесняйтесь включить эту часть "мудрости" в свой ответ. :-)

OriginalGriff

Как говорит NotPoliticallyCorrect, учиться отлаживать свой код необязательно: не больше, чем не учиться заправлять свой автомобиль топливом, если вы хотите проехать какое-либо реальное расстояние.
Избавьтесь от конкатенации строк и используйте параметризованный запрос, а также используйте отладчик, чтобы точно узнать, что происходит при запуске вашего кода.
Умение находить ошибки в коде-это важнейшая часть обучения программированию - это навык, который переносится в реальный мир и будет помогать вам всю жизнь. Но, как и все навыки, вы только улучшаете его, используя его-и это намного легче узнать на тривиальном фрагменте кода, чем на бегемоте в 2 000 000 строк...

Рейтинг:
1

Patrice T

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

Цитата:
Практическое руководство объекта не задана ссылка на экземпляр объекта

По какой-то причине ваш код не может создать экземпляр объекта Datagridview в переменной. Это не проблема, пока вы не попытаетесь использовать эту переменную.
Используйте отладчик, и вы увидите, как работает ваш код, он помогает найти проблемы и их причины.

Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Visual Basic / Visual Studio Video Tutorial-Базовая Отладка-YouTube[^]
Visual Basic .NET programming for Beginners - точки останова и инструменты отладки[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


nyt1972

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

Здесь это мой проект

Patrice T

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

nyt1972

http://ansicollege.net/vbcode/error.png

Это ошибка, которую я получаю.

Ниже приведена строка кода, в которой я получаю ошибку

dgvcc = DirectCast(DataGridView1. Rows (i).Ячейки (1), DataGridViewComboBoxCell)
.Параметры.AddWithValue ("@product", dgvcc. Value)

Я хранения значений в выпадающем списке элемента управления datagridview, product_id тип данных в базе данных имеет тип int

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.