【发布时间】:2021-02-24 18:35:16
【问题描述】:
我正在尝试开发一个网络表单,用户可以在其中通过具有多个值的查询过滤和更新 SQL Server 表。
工作原理
用户输入多个值,每个值在文本框中用空格分隔。给定所有值后,用户单击执行按钮,该按钮用逗号替换所有空格并将值分配给单个字符串变量。然后查询将过滤该变量中包含的所有值。
问题
程序将变量插入查询中:1000000,1000001
我还做了一个手动测试,如下:'1000000','1000001'
但是对于这两次尝试,我都会收到以下错误:
“1000000”附近的语法不正确
问题
如何在查询中正确传递变量中的多个值?
我的代码:
Protected Sub ExecuteButton_Click(sender As Object, e As EventArgs) Handles ExecuteButton.Click
Dim testString As String = ArticleTextbox.Text
Dim arrayOfTests As String() = testString.Split(New String() {" "}, StringSplitOptions.RemoveEmptyEntries)
Dim newString As String = String.Join(", ", arrayOfTests)
Label2.Text = newString
'SQL.AddParam("@StyleID ", newString)
Try
dt = SQL.ExecQuery("Select STYLE_ID from ItemWebCategory where STYLE_ID in " & newString & "")
'dt = SQL.ExecQuery("Select STYLE_ID from ItemWebCategory where STYLE_ID in @StyleID")
Catch ex As Exception
MsgBox(ex.Message)
End Try
GridView1.DataSource = dt
GridView1.DataBind()
End Sub
SqlControl类:
Public Class SQLControl
Private ReadOnly ConStr As String = "connection String "
Private DBCmd As SqlCommand
'Query Parameters
Public Params As New List(Of SqlParameter)
'This generates a blank sqlclient class with the deafult connection string
Public Sub New()
End Sub
'Allow connection string override
Public Sub New(connectionString As String)
ConStr = connectionString
End Sub
'Execute Query Sub
Public Function ExecQuery(query As String) As DataTable
Dim DBDT = New DataTable
Using DBCon As New SqlConnection(ConStr),
DBCmd As New SqlCommand(query, DBCon)
Params.ForEach(Sub(p) DBCmd.Parameters.Add(p))
Params.Clear()
DBCon.Open()
DBDT.Load(DBCmd.ExecuteReader)
End Using
Return DBDT
End Function
'Add variable as Paramerized objects
Public Sub AddParam(Name As String, Value As Object)
Dim NewParam As New SqlParameter(Name, Value)
Params.Add(NewParam)
End Sub
End Class
【问题讨论】:
-
IN 子句后跟一个左括号、值列表和一个右括号
-
另外你不能参数化整个字符串,你需要参数化每个值
-
为了解释@Steve 的评论,
IN子句的正确格式是IN (1, 2, 3, 4)。您忘记在值列表周围添加括号。还要知道,您编写的查询极易受到 SQL 注入的攻击。 -
@KenWhite 对,但是通过拆分然后加入,我认为安装 Sql 注入非常困难或不可能。但是,对于这样的任务,我会采取不同的设计决策。例如,在组合中显示项目描述,并使用按钮将项目 ID 添加到内部字符串,从而避免直接从用户输入 ID
-
@Steve 你在开玩笑吧。注射,对吧?拆分器仅删除空格字符 (u+0020),从而留下大量空白字符可用于分隔标记。
标签: sql sql-server vb.net