执行阅读器时获取未处理的异常

时间:2013-12-01 21:10:42

标签: vb.net oledb

帮助请我卡住了代码似乎没问题,但我得到了无法解决的异常

Imports System.Data.OleDb
Imports System.Media
Public Class login
Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click
    Dim x As Integer = 0


    Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Stock.mdb; Persist Security Info=True")
    Dim com As New OleDbCommand("SELECT [ID] FROM [login] WHERE [unameField] = username AND [pwdField] = password", con)

    Dim usrparm As New OleDbParameter("username", Me.UsernameTextBox.Text)
    Dim pwdparm As New OleDbParameter("password", Me.PasswordTextBox.Text)

    com.Parameters.Add(usrparm)
    com.Parameters.Add(pwdparm)

    com.Connection.Open()

在执行阅读器unhandeled异常

时出错
    Dim reader As OleDbDataReader = com.ExecuteReader()

    If reader.HasRows Then
        adminpanel.Show()
        Me.Close()
    Else
        MsgBox("Invalid credentials", MsgBoxStyle.OkOnly, "Error")
        x = x + 1
    End If
    com.Connection.Close()

    If x > 3 Then
        MsgBox("You don't have access to the software please cotact administrator", MsgBoxStyle.OkOnly, "Uauthorised access")
        Me.Close()
    End If
End Sub

Private Sub Cancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel.Click
    Me.Close()
End Sub

End Class

2 个答案:

答案 0 :(得分:0)

如果我没记错,Access中OleDbParamaters的语法在参数前需要@

Dim com As New OleDbCommand("SELECT [ID] FROM [login] WHERE [unameField] = @username AND [pwdField] = @password", con)

Dim usrparm As New OleDbParameter("@username", Me.UsernameTextBox.Text)
Dim pwdparm As New OleDbParameter("@password", Me.PasswordTextBox.Text)

答案 1 :(得分:0)

如果您的数据库名称和列名称与SELECT完全匹配,则此方法有效。这里的坏处是参数没有命名,因此将它们添加到集合的顺序非常重要。

   Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Stock.MDB; Persist Security Info=True")  'I use ACCDB
        Dim com As New OleDbCommand("SELECT [ID] FROM [login] WHERE ( [unameField] = ? AND [pwdField] = ?); ", con)
        com.Parameters.Clear()
        Dim parm1 As OleDb.OleDbParameter = New OleDbParameter()
        Dim parm2 As OleDb.OleDbParameter = New OleDbParameter()
        com.Parameters.Add(parm1)
        com.Parameters.Add(parm2)
        parm1.Value = Me.UsernameTextBox.Text
        parm2.Value = Me.PasswordTextBox.Text
        com.Connection.Open()
... the rest of your code goes here

我建议您查阅有关最新版ADO.NET的资源,以便构建比此更好的代码。 try / catch的用户和从表单代码中隔离数据访问代码也非常重要。