0

为什么这不会删除我的 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

这是我的数据库的图片:

在此处输入图像描述

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

4

3 回答 3

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添加到MySqlCommand. 在这种情况下,我使用了直接从值的数据类型派生正确数据类型的 AddWithValue 方法。因为Me.loginuser.Text是字符串值,所以该参数将被视为字符串值,替换不正确的单引号并删除通常用于挂载 Sql 注入攻击的无关字符。引擎将在执行时在占位符处插入正确的值来完成其余的工作

编辑:看到您对使用的 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 是否支持带@前缀的参数名称或仅支持:前缀

于 2013-03-23T13:20:46.613 回答
1

尝试

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

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

于 2013-03-23T14:15:33.387 回答
0

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

Query = "DELETE * FROM settings WHERE user = '" & Me.loginuser.Text & "'"
于 2013-03-23T12:52:32.267 回答