【问题标题】:.Net VB webform How to pass a variable with multiple values in a query?.Net VB webform 如何在查询中传递具有多个值的变量?
【发布时间】: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


【解决方案1】:

如果您想通过查询向表中插入多行,则必须多次执行 INSERT INTO 查询,例如:

For each dr as DataRow In SomeList.Rows
ExecQuery("INSERT INTO Table1 VALUES '" & dr("value1").ToString.Trim & "'")
Next

循环上面的示例查询,无论您希望在表中输入多少值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多