VB.NET SQL语句没有从Access数据库中返回任何记录。

问题描述 投票:0回答:1

我有以下代码用于登录winform。当我连接到数据库并进行选择语句时,我没有得到任何行。我得到的消息是 "该rowcolumn不存在数据"。

但是数据库中是有行和列的。

谁能告诉我我做错了什么?

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
sql vb.net winforms access
1个回答
0
投票

问题是检查 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:小幅提升性能,更好的错误消息等。

© www.soinside.com 2019 - 2024. All rights reserved.