为什么不删除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
以下是我的数据库的图片:
或者我可以以某种方式让它替换数据库中已有的内容,在这种情况下请帮助我。
答案 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 & "'"