我有以下代码用于登录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
问题是检查 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:小幅提升性能,更好的错误消息等。