Member 14814400 Ответов: 2

Как вычесть денежное значение из существующей строки в базе данных VB, SQL


Как вычесть значение в текстовом поле из существующей строки в VB?

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

Dim cmd As New SqlCommand("UPDATE TblMemberships SET wallet = @wallet WHERE Username= @username", con)
Dim adapter As New SqlDataAdapter(cmd)
Dim table As New DataTable
cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = FormLogin.TxtBoxUsername.Text
cmd.Parameters.Add("@wallet", SqlDbType.VarChar).Value = FormProfileMain.LabelWallet.Text

con.Open()

If cmd.ExecuteNonQuery() = 1 Then
   If Val(TextBoxTotal.Text) > FormProfileMain.LabelWallet.Text Then
      MsgBox("Insufficient wallet, please load!", MsgBoxStyle.Information, "Wallet")
   Else
      MsgBox("Successfully ordered!", MsgBoxStyle.ApplicationModal, "Wallet")
   End If
   con.Close()
End If

phil.o

Вы храните значение кошелька в виде строки в своей базе данных?

Member 14814400

Да, и я также попробовал изменить его тип данных в sql как money и как smallmoney

phil.o

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

Member 14814400

Я также попытался использовать sqlcommand insert и использовать table.rows для вычета, но я не знаю, как обновить его после этого.

2 Ответов

Рейтинг:
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

я так и сделал, я перепробовал все, что знаю, и это до сих пор не работает.