MySQL数据不从表VB.NET中删除

时间:2013-03-23 12:49:13

标签: mysql vb.net

为什么不删除MySQL数据库中的数据!?

Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click

 Dim dbCon As MySqlConnection      
 Dim strQuery As String = ""           
 Dim SQLCmd As MySqlCommand            
 Dim DR As MySqlDataReader            
 Try               
 dbCon = New MySqlConnection("Server=Localhost;Database=myusers;Uid=root;Pwd=Mypassword")

        strQuery = "DELETE settings FROM settings WHERE user=" & Me.loginuser.Text
        '* FROM settings WHERE user = "Testuser"'
        SQLCmd = New MySqlCommand(strQuery, dbCon)

        ' OPEN THE DB AND KICKOFF THE QUERY 
        dbCon.Open()

        DR = SQLCmd.ExecuteReader

        While DR.Read
            req1.Text = "" And exlink.Text = ""
        End While

        ' DONE! Close DB
        DR.Close()
        dbCon.Close()
    Catch ex As Exception
        TextBox8.Text = ("Fail" & vbCrLf & vbCrLf & ex.Message)
    End Try

以下是我的数据库的图片:

enter image description here

或者我可以以某种方式让它替换数据库中已有的内容,在这种情况下请帮助我。

3 个答案:

答案 0 :(得分:1)

我会尝试以这种方式更改您的代码

Using con = New MySqlConnection("Server=.....")
     con.Open()
     Dim sqlText = "DELETE * FROM settings WHERE user = @ulogin"
     Using cmd = new MySqlCommand(sqlText, con)
        cmd.Parameters.AddWithValue("@ulogin",  Me.loginuser.Text)
        cmd.ExecuteNonQuery()
     End Using
End Using

首先,不要使用字符串连接来创建要传递给数据库引擎的命令文本。这样你冒着Sql Injections的风险,如果用户名包含单引号(即O'Hara),你的代码将失败并出现语法错误(日期格式化,解析数字小数和其他全球化问题会出现同样的问题)。相反,像上面代码中的参数化查询将避免所有这些问题。

在参数化查询中,查询文本不包含搜索条件或更新或插入数据的实际值。相反,它包含占位符(在我们的例子中,它被称为@ulogin)。使用添加到MySqlParameter的Parameters集合中的一个或多个MySqlCommand指定要在占位符位置插入的正确值。在这种情况下,我使用了AddWithValue方法,该方法直接从值的数据类型派生正确的数据类型。因为Me.loginuser.Text是一个字符串值,所以该参数将被视为一个字符串值,替换不正确的单引号并删除通常用于挂载Sql注入攻击的extraneus字符。引擎将在执行时在占位符处插入正确的值

编辑:看到您对使用的MySql连接器的评论,我将尝试更新我的答案,以显示NET 1的半等效版本。

Try
     Dim con As MySqlConnection = New MySqlConnection("Server=.....")
     con.Open()
     Dim sqlText as String = "DELETE * FROM settings WHERE user = @ulogin"
     Dim cmd As MySqlCommand = new MySqlCommand(sqlText, con)
     Dim par As MySqlParameter = New MySqlParameter("@ulogin", MySqlDbType.VarChar)
     par.Value = Me.loginuser.Text
     cmd.Parameters.Add(par)
     cmd.ExecuteNonQuery()
Finally
     con.Close()
End Try

我不确定连接器1.0.10是否支持带有@前缀的参数名称或仅:前缀

答案 1 :(得分:1)

尝试

strQuery = "DELETE FROM settings " _
         & " WHERE user = '" & Me.loginuser.Text & "'"

但如前所述,您应该使用参数化查询。如果您有一个名为O'Brien的用户,那么您的查询(如上所述)将因嵌入的单引号而失败。当您使用DELETE时,您将删除整个记录,并且您已在FROM子句中指定了表名。

答案 2 :(得分:0)

我不认为你可以在mysql中使用双引号,我认为它只是单引号。尝试

Query = "DELETE * FROM settings WHERE user = '" & Me.loginuser.Text & "'"