将逗号分隔的值传递给SelectCommand

时间:2013-11-04 03:40:32

标签: c# asp.net

我的.cs文件中有以下代码:

SqlDataSource1.SelectParameters["LocID"].DefaultValue = "5957,5958";

我的.aspx文件中有以下代码

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:KuzSQL %>" OnSelecting="DataSourceSelecting"
    SelectCommand="Select ID, RoomNum from [dbo].[Mbiology] WHERE LocId IN (@LocId)" >
    <SelectParameters>
        <asp:Parameter Name="LocId" />
    </SelectParameters>        
</asp:SqlDataSource>

我收到以下错误:

  

将nvarchar值'5957,5958'转换为数据类型int。

时转换失败

请注意,LocId的类型为Int。

3 个答案:

答案 0 :(得分:0)

参数不仅仅像你想象的那样“插入”SQL。尝试将值列表传递给查询并在IN子句中使用它们是很棘手的。

一些选项:

  1. 将值作为字符串传递给将字符串解析为临时表的存储过程,然后使用IN
  2. 使用多个参数(LocId1LocId2等)设置您的命令,并将您的查询更改为:

    Select ID, RoomNum from [dbo].[Mbiology] 
    WHERE LocId IN (@LocId1, @LocId2, @LocId3, @LocId4, @LocId5, @LocId6, ...)
    
  3. 将您的参数保存到另一个表格(可能使用"sessionID"键)并从IN子句中删除。
  4. 在一个查询中不支持多个值。

答案 1 :(得分:0)

SqlDataSource控件不支持此类操作,而是至少包含以下选项:

  1. 在代码隐藏中构建查询。

    protected void SomeEventHandler(object sender, EventArgs e)
    {
        // Create list of strings to hold ID values
        List<string> locIDs = new List<string>();
    
        // Build list of actual string values
        foreach (var item in SomeControl.Items)
        {
            locIDs.Add(value);
        }
    
        // Build SELECT command
        SqlDataSource1.SelectCommand = String.Format("Select ID, RoomNum from [dbo].[Mbiology] WHERE LocId IN ({0})", 
            String.Join(", ", productIDs.ToArray()));
    }
    
  2. 创建存储过程并将ID值列表作为参数传递。

答案 2 :(得分:0)

您可以创建一个过程并在其中动态创建SQL查询。你的程序会是这样的 -

create procedure p1_proc
    @val varchar(250)
as
begin
    declare @sql as varchar(500)
    set @sql = 'Select ID, RoomNum from [dbo].[Mbiology] WHERE LocId IN ('+@val+')'
    exec(@sql)
end

所以你的sqldatasource会调用此程序。像这样的东西

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:KuzSQL %>" OnSelecting="DataSourceSelecting"
    SelectCommand="p1_proc" >
    <SelectParameters>
        <asp:Parameter Name="val" />
    </SelectParameters>        
</asp:SqlDataSource>

您可以将LocId s作为逗号分隔的字符串传递。

SqlDataSource1.SelectParameters["val"].DefaultValue = "5957,5958";