Рейтинг:
17
MadMyche
Ну, это будет неоднозначный ответ.
SQL, который у вас есть, является правильным для выполнения обновления и не подвержен SQL-инъекции.
Что наиболее вероятно неверно, так это типы данных; вычитание предполагает, что данные должны быть числовыми по своей природе- но вы проходите мимо @бумажник в текстовом виде.
Обновление: на основе поступивших комментариев... вам необходимо исправить типы данных в вашей базе данных
Что также неверно, так это последовательность событий; вы делаете обновление, прежде чем проверить, достаточно ли средств.
Чего мы не знаем, так это того, что представляют собой эти ценности, поэтому могут возникнуть и другие проблемы.
Это также выглядит, как вы не может быть правильно рассчитав значения.
Вот некоторые псевдо-VB о том, что я ожидал бы увидеть для чего-то подобного. Возможно, вам придется изменить типы данных для таких вещей, как сумма валюты.
Dim FundsNeeded as Int = Val(TextBoxTotal.Text)
Dim FundsAvailable as Int = 0
Dim NewWalletValue as Int = 0
Dim UserName = FormProfileMain.LabelWallet.Text
Dim qryWalletRetrieve as string = "SELECT wallet FROM TblMemberships WHERE Username = @username"
Dim qryWalletUpdate as string = "UPDATE TblMemberships SET wallet = @wallet WHERE Username= @username"
Dim cmd As New SqlCommand(qryWalletRetrieve, con)
cmd.Parameters.AddWithValue("@username", UserName)
con.Open()
FundsAvailable = (Int)cmd.ExecuteScalar()
If (FundsAvailable < FundsNeeded) Then
MsgBox("Insufficient wallet, please load!", MsgBoxStyle.Information, "Wallet")
Else
NewWalletValue = FundsAvailable - FundsNeeded
cmd.CommandText = qryWalletUpdate
cmd.Parameters.AddWithValue("@wallet", NewWalletValue)
Dim RA as Integer = cmd.ExecuteNonQuery() ' RA = Rows Affected
If RA = 1 Then
MsgBox("Successfully ordered!", MsgBoxStyle.ApplicationModal, "Wallet")
Else
' Oops... why are we here?
End
End
cmd.Dispose()
con.Close()
Member 14814400
в этих строках есть ошибки
FundsAvailable = (Int)cmd.Executescalar так()
и
Int RA = cmd.ExecuteNonQuery() ' RA = затронутые строки
Если (RA = 1), то
к сожалению, наш профессор не может преподавать это из-за пандемии. Спасибо!
MadMyche
Извините, VB-это не мой родной язык, и я сделал это в блокноте...
Я предварял это так: псевдокод как я и ожидал, там будут некоторые синтаксические ошибки, которые вы должны быть в состоянии выяснить.
Чтобы исправить линии с проблемами... просто перепишите их по мере необходимости. Скорее всего, вы используете IDE, такую как Visual Studio, которая имеет intellisense, чтобы помочь вам с форматированием и исправлением случаев
FundsAvailable = Конвертировать.ToInt32(cmd.ExecuteScalar())
Если RA = 1
Member 14814400
кажется, я не могу найти проблему в упомянутой выше ошибке, хотя спасибо!!
MadMyche
FundsAvailable = Конвертировать.ToInt32(cmd.ExecuteScalar())
Если RA = 1
Member 14814400
Остальные ошибки связаны именно с этим:
Int RA = cmd.ExecuteNonQuery() ' RA = затронутые строки
Если RA = 1, то
описание ошибки:
Описание Кода Серьезности Состояние Подавления Строки Файла Проекта
Ошибка BC30451 'RA' не объявлена. Он может быть недоступен из-за своего уровня защиты.
MadMyche
Ты уже догадался об этом?
Member 14814400
к сожалению, пока нет. :(
Member 14814400
СПАСИБО!! Я ЕГО ПЕРЕСМОТРЕЛ И ТЕПЕРЬ ОН РАБОТАЕТ,
ТЕПЕРЬ ЭТО КОД, КОТОРЫЙ Я ЗАПУСКАЮ
Dim FundsNeeded As Integer = Val(TextBoxTotal.Text)
Dim FundsAvailable As Integer = Val(LabelWallet.Text)
Dim NewWalletValue Как Целое Число = 0
Dim UserName = FormLogin.TxtBoxUsername.Текст
"Я изменяю его, чтобы он мог получить имя пользователя в базе данных"
Dim qryWalletRetrieve As String = "выберите кошелек из TblMemberships, где Username = @username"
Дим qryWalletUpdate как String = "обновление TblMemberships набор кошелек = @бумажник, где имя пользователя= имя пользователя"
Dim cmd As New SqlCommand(qryWalletRetrieve, con)
cmd.параметры.AddWithValue("@username", имя пользователя)
против.Открыть()
FundsAvailable = Конвертировать.ToInt32(cmd.ExecuteScalar())
Если (FundsAvailable < FundsNeeded) Затем
MsgBox("недостаточный кошелек, Пожалуйста, загрузите!", MsgBoxStyle.Информация, "Кошелек")
Еще
NewWalletValue = FundsAvailable - FundsNeeded
УМК.Свойства commandtext = qryWalletUpdate
cmd.параметры.AddWithValue ("@wallet", NewWalletValue)
Dim RA As Integer = cmd.ExecuteNonQuery() ' RA = затронутые строки
Если RA = 1, то
MsgBox("успешно заказано!", MsgBoxStyle.ApplicationModal, "Кошелек")
Еще
' Ой... почему мы здесь?
Конец, Если
Конец, Если
УМК.Располагать()
против.Закрывать()
MadMyche
Рад, что вы его исправили, пожалуйста, подумайте о том, чтобы отметить этот вопрос как решенный и оценить решения, которые вам помогли
Member 14814400
Конечно!!
MadMyche
Обновил ответ-у меня там была строка C#
Member 14814400
где я могу его найти?
Рейтинг:
0
phil.o
Прежде всего, пожалуйста, дайте вашему денежному столбцу тип данных, который он заслуживает: деньги.
Затем:
Dim cmd As New SqlCommand("UPDATE TblMemberships SET wallet = @wallet WHERE Username= @username", con)
cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = FormLogin.TxtBoxUsername.Text
Dim money As Decimal
If (Not Decimal.TryParse(FormProfileMain.LabelWallet.Text, money)) Then
money = 0
End If
cmd.Parameters.Add("@wallet", SqlDbType.Money).Value = money
con.Open()
If cmd.ExecuteNonQuery() = 1 Then
Dim total As Decimal
If (Not Decimal.TryParse(TextBoxTotal.Text, total)) Then
total = 0
End If
Dim wallet As Decimal
If (Not Decimal.TryParse(FormProfileMain.LabelWallet.Text, wallet)) Then
wallet = 0
End If
If total > wallet Then
MsgBox("Insufficient wallet, please load!", MsgBoxStyle.Information, "Wallet")
Else
MsgBox("Successfully ordered!", MsgBoxStyle.ApplicationModal, "Wallet")
End If
con.Close()
End If
Member 14814400
Я попробовал, и это не работает, labelwallet.text возвращается к 0 после того, как я нажимаю кнопку. И еще там было написано: недостаточный кошелек, пожалуйста, загружайте! даже если кошелек > всего
phil.o
Поместите точку останова в начало обработчика нажатия кнопки и запустите сеанс отладки (F5 в Visual Studio). Затем тщательно выполняйте построчно и следите за значениями переменных по пути. Это позволит вам точно определить проблему. Мы не можем сделать это за вас, так как для этого нужен точный код, а также фактические данные.
Member 14814400
мой код, который добавляет данные в кошелек, - varchar, я изменил его на деньги, и теперь он дает мне эту ошибку, не удалось преобразовать значение параметра из строки в десятичную.
phil.o
Вы также должны изменить тип данных столбца в базе данных.
Member 14814400
я так и сделал, я перепробовал все, что знаю, и это до сих пор не работает.