sql - 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
解决方案
问题是在调用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:性能提升小,错误消息更好,等等。
推荐阅读
- node.js - 带反斜杠的密码 mongoose mlab
- android - 任务 ':app:mergeDebugResources' 执行失败。react native,目前正在尝试在Android上运行
- sql-server - SQL Server Reports Builder - 显示当周日期(帮助)
- java - 使用 restController 发布对象
- azure - ASP.NET MVC Core Azure Blob Image Resizer
- r - 计算R中数字字符串的可变性指数
- excel - 如何使用 Odoo 10 中的向导生成 Excel 报告,只需单击一下
- tensorflow - 用于车牌识别的预训练 LeNet 模型
- python - OpenCV VideoCapture on Large files looping back to start frame after 4000+ frames
- node.js - React Native 注册表与后端 mongodb 和 node xpress