ASP.NET 列表框多个项目传递给 SQL 服务器然后传递给 Gridview

ASP.NET Listbox Multiple Items passed to SQL Server then passed to Gridview

我想做的是从列表框中 select 多个国家,然后点击 select,然后 gridview 会根据国家从 table 中提取数据select编辑。我的问题是我不知道如何将 (A,B,C,...) 中的国家/地区字符串传递到 SQL 服务器存储过程中。任何对此的建议都会很棒!

我的列表框是

 <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>

我的 select 按钮是

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

我的 gridview 是

 <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 服务器存储过程是

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

我的问题是我不知道如何将 (A,B,C,...) 中的国家/地区字符串传递到 SQL 服务器存储过程中。任何对此的建议都会很棒!

你可以试试这个:

在 SQL 服务器中定义一个 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。类似于:

Declare @sqlstring varchar(max);

Set @sqlstring = 'Select * from dbo.table where country in (' + @myString2 + ')';

Execute sp_executesql @sqlstring;

否则你只是试图将 IN 与一个字符串一起使用,我认为这会导致你的问题。

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