根据卡号,检查PIN码是否正确

时间:2014-05-05 20:30:10

标签: vb.net

我目前正在为大学工作,我真的坚持了。我必须使用Visual Basic 2010创建一个模拟ATM机的应用程序。我目前仍然试图检查在文本框中输入的PIN号是否与组合框中选择的卡号一致。如果用户错误地输入了三次PIN,则该卡被没收。我收到一条错误消息,说"对象变量或With块变量未设置"。以下是我写的代码:

Imports System.Data.OleDb

Public Class PinEntry

Public connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = C:\Users\ben\Documents\Programming\Year 2\Visual Studio\Assignment2\BankOfGlamorgan\EDP2011-BoG.mdb"
Friend connectionBG As New OleDbConnection
Dim ds As New DataSet
Dim da As New OleDbDataAdapter
Dim commandCardNumber As New OleDbCommand()
Dim dr As OleDbDataReader
Dim pinErrorCount As Integer
Dim ATMCardsBindingSource As New BindingSource
Dim SqlCommandCheckPIN As New OleDbCommand
Dim SqlCommandConfiscate As New OleDbCommand

Private Sub PinEntry_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    connectionBG.ConnectionString = connectionString
    commandCardNumber.Connection = connectionBG
    commandCardNumber.CommandType = CommandType.Text
    commandCardNumber.CommandText = "SELECT cardNumber FROM ATMCards"

    Try
        connectionBG.Open()
        da.SelectCommand = commandCardNumber
        da.Fill(ds, "ATMCards")
        cmbCardNumber.DataSource = ds.Tables("ATMCards")
        cmbCardNumber.DisplayMember = "cardNumber"

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    Finally
        connectionBG.Close()
    End Try
End Sub

Private Sub btnEnterPin_Click(sender As Object, e As EventArgs) Handles btnEnterPin.Click
    Try
        Me.connectionBG.Open()
        Dim PIN As String
        Dim cardNo As String

        PIN = Me.txtPIN.Text
        cardNo = Me.ATMCardsBindingSource.Current("cardNumber")

        Me.SqlCommandCheckPIN.Parameters("@PIN").Value = PIN
        Me.SqlCommandCheckPIN.Parameters("@cardNumber").Value = cardNo
        Dim dr As OleDbDataReader = Me.SqlCommandCheckPIN.ExecuteReader()

        If dr.HasRows And pinErrorCount <= 2 Then
            My.Forms.Menu.ShowDialog()
            dr.Close()
            pinErrorCount = 0
            txtPIN.Text = ""

        ElseIf pinErrorCount = 2 Then
            dr.Close()

            MessageBox.Show("PIN Entered Incorrectly Three Times Card Now Confiscated", "Card Taken", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            cardNo = Me.ATMCardsBindingSource.Current("cardNumber")
            Me.SqlCommandConfiscate.Parameters("@cardNumber").Value = cardNo
            Me.SqlCommandConfiscate.ExecuteNonQuery()

        Else
            pinErrorCount = pinErrorCount + 1
            MessageBox.Show("Incorrect PIN Please Try Again.", "Incorrect PIN", MessageBoxButtons.OK, MessageBoxIcon.Error)
            txtPIN.Text = ""

        End If

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    Finally
        Me.connectionBG.Close()
    End Try
End Sub
End Class

以下更新的代码:

Imports System.Data.OleDb

Public Class PinEntry

Public connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = C:\Users\ben\Documents\Programming\Year 2\Visual Studio\Assignment2\BankOfGlamorgan\EDP2011-BoG.mdb"
Friend connectionBG As New OleDbConnection
Dim ds As New DataSet
Dim da As New OleDbDataAdapter
Dim commandCardNumber, commandPinNumber As New OleDbCommand()
Dim dr As OleDbDataReader
Dim pinErrorCount, cardNumber, PIN As Integer
Dim oForm As Menu
Dim userInput As String

Private Sub PinEntry_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    connectionBG.ConnectionString = connectionString
    commandCardNumber.Connection = connectionBG
    commandCardNumber.CommandType = CommandType.Text
    commandCardNumber.CommandText = "SELECT cardNumber FROM ATMCards"
    commandPinNumber.Connection = connectionBG
    commandPinNumber.CommandType = CommandType.Text
    commandPinNumber.CommandText = "SELECT PIN FROM ATMCards WHERE cardNumber = ?"

    Try
        connectionBG.Open()
        da.SelectCommand = commandCardNumber
        da.Fill(ds, "ATMCards")
        cmbCardNumber.DataSource = ds.Tables("ATMCards")
        cmbCardNumber.DisplayMember = "cardNumber"

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    Finally
        connectionBG.Close()
    End Try
End Sub

Private Sub btnEnterPin_Click(sender As Object, e As EventArgs) Handles btnEnterPin.Click
    cardNumber = Convert.ToInt16(cmbCardNumber.Text)
    commandPinNumber.Parameters.Add(New OleDbParameter())
    commandPinNumber.Parameters(0).Value = cardNumber

    Try
        connectionBG.Open()
        dr = commandPinNumber.ExecuteReader()
        While dr.Read()
            PIN = dr.Item("PIN").ToString
        End While
        dr.Close()
        If PIN = userInput Then
            MsgBox("Correct PIN")
        Else
            MsgBox("Incorrect PIN")
        End If

    Catch ex As Exception
        MsgBox(ex.Message)
    Finally
        connectionBG.Close()
    End Try

End Sub

Private Sub txtPIN_TextChanged(sender As Object, e As EventArgs) Handles txtPIN.TextChanged
    userInput = txtPIN.Text
End Sub
End Class

1 个答案:

答案 0 :(得分:0)

OleDBCOmmand个对象通常以比模块级变量更多的方式使用。为了工作,他们还需要一个SQL字符串和一个与之关联的Connection对象。例如:

   Dim sql As String = "SELECT etc etc etc WHERE something = ?"

   Using cmd As New OleDbCommand(Sql, dbCon)
        cmd.Parameters.AddWithValue("@p1", myVar)
        cmd.Parameters.AddWithValue("@p2", myVar)

        Dim rdr As OleDbDataReader = cmd.ExecuteReader

        If rdr.HasRows Then
           ' do something interesting
        End If
    End Using

此处,SQL和DB Connection在创建时与Command对象关联。 Using块确保在完成后将其妥善处理。

此外,OleDbCommand对象不支持命名参数。通常,它只是忽略它们。显示了Paramters的正确方法(即AddWithValue),您可以使用实际值替换SQL字符串中的每个?占位符确定确保数据类型匹配。如果PIN是数字,则必须添加数字,而不是文本。

对于SQL,您正在测试针对卡号输入的PIN,因此这些是参数值。根据您构建SQL的方式,您可以查看数据库中的PIN是否与他们提供的PIN匹配,或者看看是否有任何行返回。