MySql - System.Data.dll 中发生类型为 'System.InvalidOperationException' 的未处理异常

标签 mysql vb.net

为此我正在使用 MYSQL 数据库...我收到以下错误...请问有人可以帮助我吗?

Imports System.Data
Imports MySql.Data Imports MySql.Data.MySqlClient
Public Class formLogin
  Dim connStr As String = "server=localhost;user=root;database=ssknet;port=3306;password=;"
  Dim connection As New MySqlConnection(connStr)

Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
    connection.Open()
    Dim cmd As New MySqlCommand("SELECT * FROM user WHERE username=@username and password=@password", connection)


    cmd.Parameters.Add("@username", MySqlDbType.VarChar).Value = txtUsername.Text
    cmd.Parameters.Add("@password", MySqlDbType.VarChar).Value = txtPassword.Text

    Dim adapter As New MySqlDataAdapter
    Dim table As New DataTable

    adapter.Fill(table)

    If table.Rows.Count <= 0 Then
        MessageBox.Show("Invalid Username or Password")
    Else
        MessageBox.Show("Login Success!")
    End If

    'cmd.ExecuteNonQuery()
    connection.Close()
End Sub

下课

我现在想访问数据库。速查

最佳答案

您错过了关键步骤。您没有向适配器分配任何命令。它不知道如何在没有命令的情况下查询任何内容

Dim adapter As New MySqlDataAdapter(cmd)

接下来,根据MySql Reserved KeyWords , user 和 password 是保留的,要在查询中将它们用作字段名称,您应该在它们周围加上反引号 (ALT+096)。所以查询应该写成

Dim cmd As New MySqlCommand("SELECT * FROM `user` 
                            WHERE username=@username 
                            AND `password`=@password", connection)

尽管有几件事需要考虑,但您的代码的一部分已经足够好了。

首先,连接对象不应该作为全局对象保存。这会导致服务器上保存的资源以及出现错误时关闭/打开连接的许多问题。只需在 using 语句中创建和丢弃连接

Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
Using connection = New MySqlConnection(connStr)
   connection.Open()

   .... all of your code except the close connection

End Using ' this close the connection also in case of exceptions

其次,如果您只想检查用户/密码是否存在,则不需要 SqlDataAdapter 和数据表

Dim reader = cmd.ExecuteReader()
if reader.HasRows then
    MessageBox.Show("Login Success!")
Else
    MessageBox.Show("Invalid Username or Password")
End If

第三,将密码以明文形式保存在数据库中然后使用查询来检索它是一个很大的安全风险。你应该使用 Salt and Hashing存储和检索密码的方法

关于MySql - System.Data.dll 中发生类型为 'System.InvalidOperationException' 的未处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48239173/

相关文章:

asp.net - ServiceController.start() 和 ServiceController.stop() 抛出异常?

c# - 加载一定数量的文件而不是扫描并加载目录中的所有文件

vb.net - 什么是从vb.net调用php文件的最快方法

vb.net - 与使用带有 getter 和 setter 的 Private 字段相比,VB.NET 中的 Property 关键字有哪些优势?

c# - 禁用数据库中的用户列表

php - Laravel SQLSTATE[HY000] [2002] 连接被拒绝

mysql - 使用共享和专用托管服务器时的数据库查询性能

mysql - 全文搜索不适用于多列

vb.net - Powershell拉电流OU

MYSQL部分匹配....位你所想