#mysql #vb.net
#mysql #vb.net
Вопрос:
В настоящее время я создаю систему управления банкоматами, я хочу, чтобы моя программа проверяла, не превышает ли введенная сумма баланс учетной записи в базе данных. Вот мой код:
Dim w As Double
w = Val(txtwithdraw.Text)
adapter = New MySql.Data.MySqlClient.MySqlDataAdapter("SELECT `balance` FROM `jaagbank` WHERE
acctnum = '" amp; Form1.namebox.Text amp; "'", con)
dtable.Clear()
adapter.Fill(dtable)
If w > dtable.Rows.Count Then
MsgBox("Insufficient Balance")
txtwithdraw.Clear()
Return
End If
Комментарии:
1. Во-первых, вам нужно убедиться, что было возвращено значение, т.Е. Проверить, что значение
dtable.Rows.Count
не равно 0. Предполагая, что вам все равно, было ли возвращено более одной строки, вам нужно проверить значение первой ячейки (индекс 0) первой строки (индекс 0). Примечание. Вы действительно должны использовать параметр SQL для значения Form1.namebox . Текст, поскольку в противном случае он сломается, если у кого-то есть апостроф в их имени, например «T’Pau».2. Я бы ожидал, что количество строк будет равно 1. Таким образом, максимальная сумма вывода должна быть меньше или равна 1?
Ответ №1:
Decimal
это хороший тип данных для использования за деньги. Не используйте vb6 Val()
. Вы можете получить неожиданные результаты. Поместите Option Strict
и Option Infer
включите. Раньше я .TryParse
тестировал ввод txtwithdraw
. Если он возвращается True
, он помещает преобразованное десятичное значение WithdrawalAmount
.
Храните свои объекты данных локально для метода, в котором они используются. Соединения и команды должны быть закрыты и удалены. Using...End Using
блоки обрабатывают это для нас, даже если есть ошибка.
Всегда используйте параметры, чтобы избежать внедрения sql. Если код выполняется Form1
, не квалифицируйте namebox
Form1
его . Кажется немного странным, что поле с именем acctnum
не является числом, а String
содержит имя. Вам нужно будет проверить вашу базу данных на наличие правильного типа данных и размера поля. Я должен был догадаться.
Поскольку вы извлекаете один фрагмент данных, вы можете использовать .ExecuteScalar
which даст вам первый столбец первой строки.
Private Sub OPCode()
Dim WithdrawalAmount As Decimal
If Not Decimal.TryParse(txtwithdraw.Text, WithdrawalAmount) Then
MessageBox.Show("Please enter a valid withdrawal amount.")
Return
End If
Dim Balance As Object
Using con As New MySqlConnection(ConStr),
cmd As New MySqlCommand("SELECT `balance` FROM `jaagbank` WHERE acctnum = @Name;", con)
cmd.Parameters.Add("@Name", MySqlDbType.VarChar, 100).Value = Form1.namebox.Text
con.Open()
Balance = cmd.ExecuteScalar
End Using
If Balance Is Nothing Then
MessageBox.Show("Account not recognized.")
Return
End If
If WithdrawalAmount > CDec(Balance) Then
MsgBox("Insufficient Balance")
txtwithdraw.Clear()
Return
End If
End Sub