繁体   English   中英

如何将行与 Visual Basic 中的特定 SQL 列相关联?

[英]How to relate a row to a specific SQL column from Visual Basic?

我正在用 Visual Basic 模拟 ATM。 我在 SQL 中有一个名为 Authentication 的表。 该表包含两列:NUM_CARD 列和 PIN_CARD 列。 在插入卡 ID 时,我需要将行 (0) 列 1、行 (1) 列 (1)、行 (2) 列 (1) 等与其他行进行匹配。 我怎样才能做到这一点? 提前致谢。

DBConnection 类如下所示:

Imports System
Imports System.Data.Sql
Imports System.Data.SqlClient

Public Class clsDBConnection

'Class variables'
Public cn As SqlConnection
Public cmd As SqlCommand
Public dr As SqlDataReader

'Constructor of the Connection class that creates the connection'
Sub New()
    Try
        cn = New SqlConnection("Data Source=JOVALLES-PC\SQLSERVEREX;Initial Catalog=SigmasBank;Integrated Security=True")
        cn.Open()

    Catch ex As Exception
        MsgBox("Error connecting due to:: " + ex.ToString)
    End Try
End Sub


'Returns true or false if the record exists or not in the database'
Function validationAutentication_p1(ByVal NUM_CARD As String) As Boolean
    Dim result As Boolean = False
    Try
        cmd = New SqlCommand("Select * from Autentication where NUM_CARD='" & NUM_CARD & "'", cn)
        dr = cmd.ExecuteReader


        If dr.HasRows Then
            result = True
        End If
        dr.Close()
    Catch ex As Exception
        MsgBox("Error in the procedure: " + ex.ToString)
    End Try
    Return result
End Function

Function validationAutentication_p2(ByVal PIN_CARD As String) As Boolean
    Dim result As Boolean = False
    Try
        cmd = New SqlCommand("Select * from Autentication where PIN_CARD='" & PIN_CARD & "'", cn)
        dr = cmd.ExecuteReader

        If dr.HasRows Then
            result = True
        End If
        dr.Close()
    Catch ex As Exception
        MsgBox("Error in the procedure: " + ex.ToString)
    End Try
    Return result
End Function

End Class

插入卡 ID 表格:

Public Class FRM_InsertCardID

Public conn As New clsDBConnection

Private Sub BTN_Ok_Click(sender As Object, e As EventArgs) Handles BTN_Ok.Click


    If TXB_CardID.Text.Length = 0 Then
        MsgBox("Please fill in field.")


    ElseIf TXB_CardID.Text.Length > 0 And TXB_CardID.Text.Length < 16 Then

        MsgBox("Your Card ID must be 16 digits.")

    ElseIf conn.validationAutentication_p1(TXB_CardID.Text) = False Then


        MsgBox("The Card ID doesn't exist.")


    Else
        FRM_PIN.Show()
        Me.Hide()
        TXB_CardID.Text = ""

    End If



End Sub

插入 PIN 表格:

Public Class FRM_PIN

Public conn As New clsDBConnection


Private Sub BTN_Ok_Click(sender As Object, e As EventArgs) Handles BTN_Ok.Click


    If TXB_PIN.Text.Length = 0 Then

        MsgBox("Please fill in field.")

    ElseIf TXB_PIN.Text.Length > 0 And TXB_PIN.Text.Length < 4 Then

        MsgBox("Your PIN must be 4 digits.")

    ElseIf conn.validationAutentication_p2(TXB_PIN.Text) = False Then


        MsgBox("Incorrect PIN Please try again.")


    Else

        FRM_Transaction.Show()
        Me.Hide()
        TXB_PIN.Text = ""


    End If


End Sub

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

不知道错别字是否会导致问题? - - 验证

"我在 SQL 中有一个名为 Authentication 的表。" " cmd = New SqlCommand("Select * from Autentication where PIN_CARD='" & PIN_CARD & "'", cn)"

让我们从clsDBConnection开始。 您不需要导入System 默认情况下就在那里。 System.Data.Sql从未使用过。 也摆脱它。

有人会认为这个类是关于数据库连接的。 它不是。 它包含用于身份验证的代码。 所以重命名; 类似数据访问的东西。

永远不要建立连接、命令和阅读器类级别的变量。 这些数据库对象需要关闭和处理,因此类不在声明它们的地方。 它们需要是局部变量,是使用它们的方法的局部变量。

永远,永远不要在使用之前打开连接。 理想情况下,调用.Execute...方法之前的行。 确保它也被关闭并尽快处理。 您的代码打开一个连接,让它随风飘动。

您可以在 DataAccess 类中做的是使您的连接字符串成为 Private 类级别变量。 Private cnString as String = ...

我根本看不出你在哪里需要自定义构造函数。 去掉Sub New()我已经在你的类中创建了 2 个方法Shared这个数据由类的所有实例共享,你没有声明类的实例来使用这些方法。 您可以仅通过引用类和方法的名称来调用共享方法。 conString 也是Shared因为它被共享方法使用。

我决定引脚号不一定是唯一的,因为它们最多只能达到 9999。这就是我在第二种方法中使用 2 个参数的原因。

注意:我不得不猜测 SqlParameters 的数据类型和字段大小。 检查您的数据库并相应地调整代码。

Public Class FRM_InsertCardID

    Private Sub BTN_Ok_Click(sender As Object, e As EventArgs) Handles BTN_Ok.Click
        If TXB_CardID.Text.Length = 0 Then
            MsgBox("Please fill in field.")
            'Don't give the user any information on what a proper card ID consists of
            Return
        End If

        If DataAccess.validationAutentication_p1(TXB_CardID.Text) = False Then
            MsgBox("The Card ID doesn't exist.")
        Else
            FRM_PIN.Show()
            'It appears you are using the default instance of FRM_PIN
            FRM_PIM.CardID = TXB_CardID.Text
            TXB_CardID.Text = ""
            Me.Hide()
        End If
    End Sub

End Class

Public Class FRM_PIN

    Friend CardID As String

    Private Sub BTN_Ok_Click(sender As Object, e As EventArgs) Handles BTN_Ok.Click

        If TXB_PIN.Text.Length = 0 Then
            MsgBox("Please fill in field.")
            Return 'Exits the sub
        End If

        If DataAccess.validationAutentication_p2(CardID, TXB_PIN.Text) = False Then
            MsgBox("Incorrect PIN Please try again.")
        Else
            TXB_PIN.Text = ""
            FRM_Transaction.Show()
            Me.Hide()
        End If
    End Sub

End Class
Public Class DataAccess

    Private Shared conString As String = "Data Source=JOVALLES-PC\SQLSERVEREX;Initial Catalog=SigmasBank;Integrated Security=True"

    Public Shared Function validationAutentication_p1(ByVal NUM_CARD As String) As Boolean
        Dim result = False
        Using cn As New SqlConnection(conString),
                cmd As New SqlCommand("Select * from Autentication where NUM_CARD= @NumCARD;", cn)
            cmd.Parameters.Add("@NumCard", SqlDbType.VarChar, 16).Value = NUM_CARD
            cn.Open()
            Using dr = cmd.ExecuteReader
                If dr.HasRows Then
                    result = True
                End If
            End Using
        End Using
        Return result
    End Function

    Public Shared Function validationAutentication_p2(ByVal CardID As String, ByVal PIN_CARD As String) As Boolean
        Dim result = False
        Using cn As New SqlConnection(conString),
                cmd As New SqlCommand("Select * From Autentication where NUM_CARD = @NumCard AND PIN_CARD=@PinCard;", cn)
            cmd.Parameters.Add("@NumCard", SqlDbType.VarChar, 100).Value = CardID
            cmd.Parameters.Add("@PinCard", SqlDbType.VarChar, 4).Value = PIN_CARD
            cn.Open()
            Using dr = cmd.ExecuteReader()
                If dr.HasRows Then
                    result = True
                End If
            End Using
        End Using
        Return result
    End Function

End Class

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM