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
我的 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 传递到您的存储过程中,但这可能有点矫枉过正。
我想做的是从列表框中 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
我的 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 传递到您的存储过程中,但这可能有点矫枉过正。