0

我的 .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 类型。

4

3 回答 3

0

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

一些选项:

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

    Select ID, RoomNum from [dbo].[Mbiology] 
    WHERE LocId IN (@LocId1, @LocId2, @LocId3, @LocId4, @LocId5, @LocId6, ...)
    
  3. 将您的参数保存到另一个表(可能带有键)并从您的子句"sessionID"中提取。IN
  4. 一个查询不支持多个值。
于 2013-11-04T03:47:41.670 回答
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>

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

SqlDataSource1.SelectParameters["val"].DefaultValue = "5957,5958";
于 2013-11-04T07:02:47.820 回答
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 值列表作为参数传递。

于 2013-11-04T03:57:03.467 回答