Проверка, достаточен ли фонд

#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