多次提供参数“@stIdCity”asp.net c#

问题描述 投票:0回答:2

我正在尝试通过包含我从数据库获取的国家/地区名称的列表框将值发送到存储过程。如果我选择一个选项代码则 100% 100% 有效。但如果我输入 2 或 3 个选项,则会出现以下错误:

多次提供参数“@stIdCity”。

第322行:da.Fill(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

列表图片:

请帮忙解决问题。

抱歉,如果问题重复,但我找不到解决方案。

c# asp.net sql-server
2个回答
3
投票

你有这个:

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

因此,对于每个选定的城市,您添加一个 new 参数。这就是您收到该错误消息的原因。

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

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

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

首先,我使用 LINQ 来筛选所选项目,然后获取它们的值。

string.Join
用逗号组合结果值。

但请注意,您的存储过程仅接受

nvarchar(20)
,因此当选择多个城市时,您可能会耗尽空间。


2
投票

您只有一个参数,并且它是一个以逗号分隔的值字符串。

因此,您必须“构建”一个逗号分隔的字符串。像这样说:

        string myparms = "";
        foreach (ListItem item in lstBoxTestCity.Items)
        {
            if (item.Selected)
            {
                if (myparms != "")
                    myparms += ",";

                myparms += item.Value;

            }
        }
        cmd.Parameters.Add("@stIdCity",SqlDbType.NVarChar).Value = myparms;

因此,您只传递一个值 - 但您必须构建要传递的值的“字符串”。

© www.soinside.com 2019 - 2024. All rights reserved.