【问题标题】:Using a listbox to declare a parameter in my sql statement使用列表框在我的 sql 语句中声明参数
【发布时间】:2023-04-10 04:12:01
【问题描述】:

我有一个允许选择多个值的列表框。

这是我对 gridview 的查询

saocmd.CommandText = "SELECT B603SalesAsOFMASTER.SDESCR, B603SalesAsOFMASTER.DYYYY, B603SalesAsOFMASTER.AsOFSales, B603SalesAsOFMASTER.ASOFPAX, B603SalesAsOFMASTER.YESales, B603SalesAsOFMASTER.YEPAX, B603SalesAsOFMASTER.PCTofSales, B601SalesAsOF.Sales AS CurrentSales, B601SalesAsOF.PAX AS CurrentPAX FROM B603SalesAsOFMASTER INNER JOIN B601SalesAsOF ON B603SalesAsOFMASTER.SDESCR = B601SalesAsOF.SDESCR WHERE (B603SalesAsOFMASTER.DYYYY =@Dyyyy) AND (B601SalesAsOF.DYYYY = (year( getdate() ))) and B603SalesAsOFMASTER.SDESCR in (@regions)order by B603SalesAsOFMASTER.SDESCR"

这是我对列表框的查询

listcmd.CommandText = "SELECT distinct B603SalesAsOFMASTER.SDESCR FROM B603SalesAsOFMASTER"

我希望用户在 gridview 中选择他们想要查询的所有区域。

到目前为止,我正在将每个选定的列表项放入一个文本框

Function list()
    Dim li As ListItem
       For Each li In ListBox1.Items
         If li.Selected Then
            TextBox1.Text &= "'" & li.Text & "' ," & vbCrLf
       End If
Next
End Function

然后在运行查询之前我使用 减去 final ,所以我没有收到错误,我必须在我的查询中使用 textbox1.text 而不是参数。这是较慢和 sql 注入,我需要帮助以更好的方式这样做谢谢

If TextBox1.Text.EndsWith(",") Then
        TextBox1.Text = TextBox1.Text.Substring(0, TextBox1.Text.Length - 1)
            End If

【问题讨论】:

  • 您不能使用逗号分隔列表作为选择命令的参数。您必须编写一个表值函数来迭代数据库中的参数(MS-SQL-Server?):sommarskog.se/arrays-in-sql-2005.html#CSV
  • 所以存储过程是不可避免的,哈哈我没用过
  • 如果你不想要 sql 注入,是的。另外我建议不要使用区域文本,而是使用区域的 ID 作为选择命令。选择主键比选择 varchar 列更快。

标签: asp.net sql vb.net parameters sql-injection


【解决方案1】:

您不能将逗号分隔的列表用作选择命令的参数。您必须编写一个表值函数来迭代数据库中的参数(MS-SQL-Server?):Comma-separated List of Values

CREATE FUNCTION iter$simple_intlist_to_tbl (@list nvarchar(MAX))
   RETURNS @tbl TABLE (number int NOT NULL) AS
BEGIN
   DECLARE @pos        int,
           @nextpos    int,
           @valuelen   int

   SELECT @pos = 0, @nextpos = 1

   WHILE @nextpos > 0
   BEGIN
      SELECT @nextpos = charindex(',', @list, @pos + 1)
      SELECT @valuelen = CASE WHEN @nextpos > 0
                              THEN @nextpos
                              ELSE len(@list) + 1
                         END - @pos - 1
      INSERT @tbl (number)
         VALUES (convert(int, substring(@list, @pos + 1, @valuelen)))
      SELECT @pos = @nextpos
   END
   RETURN
END

【讨论】:

  • 谢谢,所以这个函数将进入我的存储过程,或者这是我数据库中的一个函数,我可以在我的 sql 语句中调用
  • 我知道这是一个愚蠢的问题,但我在处理数据库方面非常陌生
  • 这是一个表值函数。它返回逗号分隔列表的表格表示形式。因此,您可以像普通表一样从任何地方查询和加入它。你应该花时间学习它;-)
  • o 太棒了,我可以在我的查询语句中使用它,但是我如何将我的列表框与它联系起来
猜你喜欢
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多