提问者:小点点

参数'@stIdCity'已提供多次。净碳#


我试图通过一个列表框将值发送到存储过程,该列表框包含我从数据库中获取的国家名称。如果我选择一个选项,代码100%工作100%。但如果我放置2或3个选项,我会得到以下错误:

参数@stIdCity提供了多次。

第322行:da。填充(ds);

完整代码:

protected void lstBoxTestCity_SelectedIndexChanged(object sender, EventArgs e)
{
    string str = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

    using (SqlConnection con = new SqlConnection(str))
    {
        using (SqlCommand cmd = new SqlCommand("Tprocedure", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;

            foreach (ListItem item in lstBoxTestCity.Items)
            {
                if (item.Selected)
                {
                   cmd.Parameters.AddWithValue("@stIdCity", item.Value);
                }
            }
                
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds);

            gvProducts.DataSource = ds;
            gvProducts.DataBind();
        }
    }
}

存储过程:

CREATE PROCEDURE Tprocedure
    (@stIdCity NVARCHAR(20) = NULL, )
AS
BEGIN
    SELECT * 
    FROM employees
    INNER JOIN TCity ON employees.IdstICity = TCity.IdstICity 
    WHERE (employees.IdstICity IN (SELECT ITEM 
                                   FROM dbo.SplitString(@stIdCity, ',')) 
       OR ISNULL(@stIdCity, '') = '')
END

列表图像:

请帮助解决这个问题。

对不起,如果问题重复了,但我找不到解决办法。


共1个答案

匿名用户

你有这个:

foreach (ListItem item in lstBoxTestCity.Items)
{
   if (item.Selected)
   {
       cmd.Parameters.AddWithValue("@stIdCity", item.Value);
   }
}

因此,对于每个选定的城市,您将添加一个新参数。这就是为什么您会收到错误消息。

显然,您需要一个以逗号分隔的值的参数。所以建立它:

var value = string.Join(",",lstBoxTestCity.Items.Where(it => it.IsSelected).Select(it => it.Value));

cmd.Parameters.Add("@stIdCity", SqlDbType.NVarChar, 20).Value = value;

首先,我使用LINQ筛选选定的项目,然后得到它们的值。join将结果值与逗号组合。

但是请注意,您的存储过程只接受一个nvarchar(20),因此当选择了多个城市时,您可能会耗尽空间。