【问题标题】:Why do I keep getting this mysql error?为什么我不断收到这个mysql错误?
【发布时间】:2013-11-16 21:22:00
【问题描述】:

大家好! 我最近一直在开发一个简单的 vb.net 程序,该程序连接到 mysql 数据库以使用给定的凭据注册和登录用户。我已使用此代码注册我的用户,但我不断收到错误(代码下方)

Dim insertUser As String = "INSERT INTO users(ID, username, password, email, verif)" _
        & " VALUES('','" & Username.Text & "','" & Password.Text & "','" & Email.Text & "','" & currentRandString & "');"
        Dim checkUsername As String = "SELECT * FROM users WHERE username='" & Username.Text & "'"
        MysqlConn = New MySqlConnection()
        MysqlConn.ConnectionString = mysqlconntxt4reg
        MysqlConn.Open()

        Dim myCommand As New MySqlCommand
        myCommand.Connection = MysqlConn
        myCommand.CommandText = checkUsername

        myAdapter.SelectCommand = myCommand
        Dim myData As MySqlDataReader
        myData = myCommand.ExecuteReader

        If myData.HasRows > 0 Then
            MsgBox("Username Already In Use...", MsgBoxStyle.Critical, "Error")
            myData.Close()
        Else
            myData.Close()
            Dim myCommand2 As New MySqlCommand
            myCommand2.Connection = MysqlConn
            myCommand2.CommandText = insertUser

            myAdapter.SelectCommand = myCommand2
            Dim myData2 As MySqlDataReader
            myData2 = myCommand2.ExecuteReader
            Mail(Email.Text, currentRandString)
            Me.Close()
            myData2.Close()
        End If
    Catch myerror As MySqlException
        MsgBox("Error While Connecting To Database:" & vbNewLine & vbNewLine & myerror.ToString, MsgBoxStyle.Critical, "Error")
    Finally
        MysqlConn.Dispose()
    End Try

我在打开其他数据读取器之前已经关闭了所有数据读取器,所以我不明白为什么这不起作用...

错误:

Link to Error Image

我将不胜感激有关此主题的任何帮助! 谢谢 罗迪特

【问题讨论】:

  • 可能是因为已经有一个打开的 DataReader 与该连接关联。
  • 您的代码对SQL Injection 开放 - 永远不要以这种方式连接 SQL。请改用参数化查询。

标签: mysql vb.net visual-studio-2010 vba


【解决方案1】:

我会在所有一次性对象周围使用 using 语句,以确保它们在不再需要时释放对连接的每个引用,但是查看您的代码,我认为您根本不需要数据读取器,因为你可以用命令解决你的问题

Dim insertUser As String = "INSERT INTO users(username, password, email, verif)" _
                            & " VALUES(@p1, @p2,@p3,@p4)"
Dim checkUsername As String = "SELECT COUNT(*) FROM users WHERE username=@p1"

Using MysqlConn = New MySqlConnection(mysqlconntxt4reg)
Using myCommand = New MySqlCommand(checkUsername, MysqlConn)
    MysqlConn.Open()
    myCommand.Parameters.AddWithValue("@p1", Username.Text)
    Dim result = myCommand.ExecuteScalar()
    if result IsNot Nothing AndAlso Convert.ToInt32(result) > 0 Then
         MsgBox("Username Already In Use...", MsgBoxStyle.Critical, "Error")
    Else
        Using myCommand2 = New MySqlCommand(insertUser, MysqlConn)
               mycommand2.Parameters.AddWithValue("@p1",Username.Text)
               mycommand2.Parameters.AddWithValue("@p2",Password.Text )
               mycommand2.Parameters.AddWithValue("@p3",Email.Text) 
               mycommand2.Parameters.AddWithValue("@p4",currentRandString )
               myCommand2.ExecuteNonQuery()
               Mail(Email.Text, currentRandString)
        End Using      
    End If
End Using
End Using

当然,我已经用参数化查询替换了您的字符串连接。这对于避免 Sql Injection 来说确实是一件很重要的事情

我已将检查用户存在的查询替换为可与命令 ExecuteScalar 一起使用的标量操作。此外,在第一个查询中,您似乎尝试使用空字符串插入字段 ID。我认为第一个字段 (ID) 是一个自动编号字段,在这种情况下,您不要将其添加到插入查询中,也不要传递任何值,因为数据库会为您计算该字段。

【讨论】:

  • 在这一行使用 (MysqlConn = New MySqlConnection(mysqlconntxt4reg)) 我收到此错误:未为类型“MySql.Data.MySqlClient.MySqlConnection”和“MySql.Data”定义运算符“=”。 MySqlClient.MySqlConnection'
  • 实际上现在我遇到了一个空引用异常问题...请帮助我!
  • 当我点击注册按钮时,它给我的对象引用未设置为对象实例
  • 在哪一行?使用调试器很容易发现这一点。在第一行代码设置断点并运行应用程序,当代码到达断点时逐步进行,直到找到触发错误的空变量
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
相关资源
最近更新 更多