Roy Jhon Cubillan Ответов: 3

Фатальная ошибка при выполнении команды


Sub AddToCart()
        Try
            If txtQty.Text = String.Empty Or txtQty.Text = "0" Then Return
            Dim sdate As String = Now.ToString("yyyy-MM-dd")
            cn.Open()
            cm = New MySqlCommand("INSERT INTO tblcart (invoice, pid, price, qty, sdate, user) VALUES(@invoice, @pid, @price, @qty, @sdate, @user)", cn)
            With FormPOS
                cm.Parameters.AddWithValue("@invoice", .lblInvoice.Text)
                cm.Parameters.AddWithValue("@pid", lblPID.Text)
                cm.Parameters.AddWithValue("@price", CDbl(lblPrice.Text))
                cm.Parameters.AddWithValue("@qty", CInt(txtQty.Text))
                cm.Parameters.AddWithValue("@sdate", sdate)
                cm.Parameters.AddWithValue("@user", strUser)
                cm.ExecuteNonQuery()
                cn.Close()

                cn.Open()
                cm = New MySqlCommand("update tblcart set total = price * qty where invoice like '" & .lblInvoice.Text & "'", cn)
                cm.ExecuteNonQuery()
                cn.Close()
                .txtSearch.Focus()
                .txtSearch.SelectionStart = 0
                .txtSearch.SelectionLength = .txtSearch.Text.Length
                .LoadCart()
            End With
            Me.Dispose()
        Catch ex As Exception
            cn.Close()
            MsgBox(ex.Message, vbCritical)
        End Try
    End Sub


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

Can anyone help? i have check all the problems but nothing seems to solve this problem

3 Ответов

Рейтинг:
2

OriginalGriff

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

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Если вы не знаете, как его использовать, то быстрый Google для "Visual Studio debugger" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

2) Использование обновления с подобным условием для обновления цен на основе частичного номера счета - фактуры вызывает у меня дрожь по спине - я встречался с инспекторами НДС и не хочу этого снова, они не дружелюбные люди-и, вероятно, это очень опасная бухгалтерская практика ...


Рейтинг:
1

Patrice T

Цитата:
Фатальная ошибка при выполнении команды

Это не дает нам никакой информации о том, в чем заключается проблема.
Вы должны дать нам точное сообщение об ошибке и положение.
Совет: во время охоты за ошибками в вашем коде удалите try/catch из вашего кода.

Ваша вторая команда SQL подчиняется SQL-инъекция но первое - это иммунитет.


Рейтинг:
0

Ashutosh Gpt

не могли бы вы предоставить еще какую-нибудь информацию, например полную ошибку, ошибку от первого executeNonquery или второго executeNonquery... это может быть проблема raiseCondition здесь. может быть, ваше первое соединение все еще не закрыто, и вы пытаетесь открыть то же самое соединение снова..
можете ли вы проверить, имея два экземпляра соединения для каждого запроса?