我正在尝试将值从TextBox
(txtTableNumber.Text
)传递到我的SQL中,用于" FROM"条款。
我使用以下代码:
Private Sub cmdDelete_Click(sender As Object, e As EventArgs) Handles cmdDelete.Click
For Each row As DataGridViewRow In dgvSales.SelectedRows
SQL.DataUpdate("DELETE FROM '" + txtTableNumber.Text + "' WHERE sl ="1" ")
Next
End sub
答案 0 :(得分:1)
目前您对SQL注入非常开放,因此这就是推荐参数的原因。
由于您传递的是一个表名,这可能会有点困难,但我认为这应该可以为您提供所需信息:
"DECLARE @DynamicSQL NVARCHAR(1000) = N'DELETE FROM ' + @GetTableName + ' WHERE sl = ''1''' EXECUTE sp_executesql @DynamicSQL"
然后,您需要将参数@GetTableName
添加到SQL.DataUpdate
并为其指定txtTableNumber.Text
的值。
由于字符串看起来有点混乱,您可能需要考虑使用存储过程来处理它。再次传递@GetTableName
参数。
我不确定你宣称SQL
是什么。通常我使用SqlCommand类来执行我的SQL。像这样:
Using con As New SqlConnection(connectionString),
cmd As New SqlCommand("DECLARE @DynamicSQL NVARCHAR(1000) = N'DELETE FROM ' + @GetTableName + ' WHERE sl = ''1''' EXECUTE sp_executesql @DynamicSQL", con)
con.Open()
cmd.Parameters.Add("@GetTableName", SqlDbType.NVarChar).Value = txtTableNumber.Text
cmd.ExecuteNonQuery()
End Using
如果您能澄清SQL
是什么,我可以提供更好的解决方案。
答案 1 :(得分:-1)
只需删除表名周围的'
,然后将其添加到sl
部分:
SQL.DataUpdate("DELETE FROM " + txtTableNumber.Text + " WHERE sl ='1' ")
无论如何,你必须小心这句话。如果您的txtTableNumber
有人写yourTableName;drop yourTableName; --
,那么您的表格将会被删除。这就是为什么不推荐使用表名作为字符串创建动态字符串的原因。您最好使用case语句来验证输入,例如:
Select Case txtTableNumber.Text
Case "Table1"
SQL.DataUpdate("DELETE FROM Table1 WHERE sl ='1' ")
Exit Select
Case "Table2"
SQL.DataUpdate("DELETE FROM Table2 WHERE sl ='1' ")
Exit Select
...
End Select