首页 > 解决方案 > VB.NET SQL 语句不从 Access 数据库返回任何行

问题描述

我有以下用于登录 winform 的代码。当我与数据库建立连接并进行选择语句时,我没有返回任何行。我收到消息“行/列不存在数据”。

但是数据库中有行和列。

有人可以告诉我我做错了什么吗?

Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click
    Dim connectionString As String = System.Configuration.ConfigurationManager.ConnectionStrings("MySqlConnectionString").ConnectionString
    Using con As New OleDbConnection(connectionString)
        Dim intResult As Integer = 0
        ' MsgBox(connectionString)
        Try
            con.Open()

            Using cmd As New OleDbCommand("SELECT Gebruikersnaam FROM Gebruikers WHERE Gebruikers.Gebruikersnaam = @Username", con)
                cmd.Parameters.AddWithValue("@Username", UsernameTextBox.Text)
                cmd.Parameters.AddWithValue("@Password", PasswordTextBox.Text)
                Using dr As OleDbDataReader = cmd.ExecuteReader()

                    'intResult = CInt(cmd.ExecuteScalar)

                    'If intResult > 0 Then
                    MsgBox(dr.Item("Gebruikersnaam").ToString)
                    'End If

                    With dr
                        While .Read()
                            MsgBox(.HasRows)
                            'MsgBox(.Item("Gebruikersnaam"))
                            'TextBox1.Text = .Item("Gebruikersnaam") & vbCrLf
                        End While
                    End With
                End Using
            End Using

        Catch ex As Exception
            MsgBox(ex.Message)

            con.Close()
        End Try

        Me.Close()
    End Using
End Sub

标签: sqlvb.netwinformsms-access

解决方案


问题是在调用dr.Item() 之前dr.Read()进行检查。除此之外,确保UsernameTextBox数据库中确实存在用户名,修复那些讨厌的纯文本密码,你会没事的。

Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click
    Dim connectionString As String = System.Configuration.ConfigurationManager.ConnectionStrings("MySqlConnectionString").ConnectionString
    Try
        Dim result As New StringBuilder()
        Using con As New OleDbConnection(connectionString)
        Using cmd As New OleDbCommand("SELECT Gebruikersnaam FROM Gebruikers WHERE Gebruikersnaam = @Username", con)

            cmd.Parameters.AddWithValue("@Username", UsernameTextBox.Text)
            cmd.Parameters.AddWithValue("@Password", PasswordTextBox.Text)
            con.Open()

             Using dr As OleDbDataReader = cmd.ExecuteReader()
                  While dr.Read() 
                      'MsgBox(dr("Gebruikersnaam"))
                      result.AppendLine(dr("Gebruikersnaam"))
                  End While
              End Using
        End Using
        End Using
        TextBox1.Text = result.ToString()
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

最后一个问题。我不确定您使用的是哪个 OLE 提供程序,但上次我检查了大多数使用 OLE 有意义的提供程序,希望您使用?占位符而不是命名参数。所以 SQL 命令看起来像这样:

SELECT Gebruikersnaam FROM Gebruikers WHERE Gebruikersnaam = ?

但是如果你真的在使用 MySql,正如连接字符串的名字所暗示的那样,你真的会更好地获得真正的 MySql ADO.Net 库而不是 OleDB:性能提升小,错误消息更好,等等。


推荐阅读