【问题标题】:ASP.NET Listbox Multiple Items passed to SQL Server then passed to GridviewASP.NET 列表框多个项目传递给 SQL Server,然后传递给 Gridview
【发布时间】:2015-03-06 21:34:01
【问题描述】:

我要做的是从列表框中选择多个国家,然后点击选择,然后网格视图会根据所选国家从表格中提取数据。我的问题是我不知道如何将字符串 where country in (A,B,C,...) 传递给 SQL Server 存储过程。任何关于这方面的建议都会很棒!

我的列表框是

 <asp:ListBox ID="Country" cssclass="LBox" runat="server" SelectionMode="Multiple">
             <asp:ListItem Text="A" Value="A" />
             <asp:ListItem Text="B" Value="B" />
             <asp:ListItem Text="C" Value="C"  />
             <asp:ListItem Text="D" Value="D"  />
                     ..............
        </asp:ListBox>

我的选择按钮是

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim li As ListItem
    Dim myString As String = ""
    Dim myString2 As String = ""

    For Each li In ListBoxComp.Items
        If li.Selected = True Then
            If myString = "" Then
                myString = "'" & li.Text & "'"
            Else
                myString = myString & ", " & "'" & li.Text & "'"
            End If
        End If
    Next
    myString2 = myString2
    Session("Selected") = myString2

来自 http://forums.asp.net/t/1618260.aspx?code+SQL+to+retrieve+records+from+multiple+random+selection+list+box

我的网格视图是

 <asp:GridView ID="GridView1" runat="server" 
      AutoGenerateColumns="False" BackColor="White" 
      BorderColor="#999999" BorderStyle="Solid" BorderWidth="1px" 
      CellPadding="3" DataSourceID="SqlDataSource1" ForeColor="Black" 
      GridLines="Vertical">
      ......
 </asp:GridView>

数据源是

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
     ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
     SelectCommand="usp_select" SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:SessionParameter Name="myString2" SessionField="Selected" />
    </SelectParameters>
</asp:SqlDataSource>

SQL Server 存储过程是

ALTER PROCEDURE [dbo].[usp_select]
    @myString2 varchar(5000)
AS
BEGIN
   SELECT * 
   FROM dbo.table 
   WHERE country IN (@myString2)
END

我的问题是我不知道如何将字符串 where country in (A,B,C,...) 传递到 SQL Server 存储过程。任何关于这方面的建议都会很棒!

【问题讨论】:

    标签: asp.net sql-server vb.net gridview listbox


    【解决方案1】:

    在您从中获取代码的示例中,您必须在存储过程中使用动态 sql。比如:

    Declare @sqlstring varchar(max);
    
    Set @sqlstring = 'Select * from dbo.table where country in (' + @myString2 + ')';
    
    Execute sp_executesql @sqlstring;
    

    否则,您会尝试仅将 IN 与字符串一起使用,我认为这会导致您的问题。

    但老实说,我尽可能远离动态 sql。您可能会考虑找到一个好的拆分字符串函数,将您的字符串转换为表格或 cte。然后,您可以在连接或“where exists”子句中使用这些行。我喜欢将这样的东西作为 xml 传递,并使用 xml 函数来创建类似的 cte。最后一种替代方法是创建一个仅包含字符串行的用户定义表类型,并将其从前端的数据表传递到您的存储过程中,但这可能有点过头了。

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      在 SQL Server 中定义一个 StrList 数据类型:

      USE [YourDB]
      GO
      CREATE TYPE [dbo].[StrList] AS TABLE(
          [Value] [varchar](100) NULL
      )
      GO
      

      更改您的存储过程以接受那种参数而不是字符串:

      ALTER PROCEDURE [dbo].[usp_select]
          @countryList AS StrList READONLY
      AS
      BEGIN
         SELECT * 
         FROM dbo.table 
         WHERE country IN (SELECT Value FROM @countryList)
      END
      

      将国家名称作为 StrList 而不是字符串传递。但是,我不确定如何使用 SessionParameter 来做到这一点。在代码隐藏中,我这样做:

      Dim tbl As new DataTable()
      tbl.Columns.Add("Value", System.Type.GetType("System.String"));
      For Each li In ListBoxComp.Items
          If li.Selected = True Then
              tbl.Rows.Add(li.Text)
          End If
      Next
      Dim prm As new SqlParameter("@countryList", SqlDbType.Structured)
      prm.Direction = ParameterDirection.Input
      prm.Value = tbl
      

      我希望这能给你一些想法,并且我从 C# 到 VB.NET 的翻译是正确的......

      【讨论】:

      • 感谢您的建议!这是个好主意!虽然我仍在使用 SQL Server 2005,但无法创建类型。我会看看我是否可以使用替代品..
      猜你喜欢
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 2015-04-12
      • 2011-12-10
      • 1970-01-01
      相关资源
      最近更新 更多