【问题标题】:Parameter '@stIdCity' was supplied multiple times asp.net c#参数'@stIdCity'被多次提供asp.net c#
【发布时间】:2022-01-17 00:34:30
【问题描述】:

我正在尝试通过包含我从数据库中获取的国家名称的列表框将值发送到存储过程。如果我选择一个选项代码 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

列表图片:

请帮忙解决问题。

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

【问题讨论】:

  • @HansKesting 你好,谢谢你的回复,如果我可以分享一些代码,我该怎么做。抱歉,我不是这样做的专家
  • 我强烈建议您将此过程转换为使用表值参数,或者至少使用 JSON 或 XML
  • 你好/谢谢你的建议/你能分享一些@Charlieface的链接示例
  • 试试这个stackoverflow.com/a/66067309/14868997,虽然网上有很多教程。

标签: c# asp.net sql-server


【解决方案1】:

你有这个:

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 将结果值与逗号组合。

But do note that your stored procedure accepts just a nvarchar(20), so you may run out of space when multiple cities have been selected.

【讨论】:

  • 你好兄弟,谢谢你的回复/我删除了foreach行和if(item.Selected)行,把你分享给我的代码放上去。 where 条件语句存在问题,如下所示:错误 CS1061 'ListItemCollection' 不包含对 'Where' 的定义,并且找不到接受类型为 'ListItemCollection' 的第一个参数的可访问扩展方法 'Where'(您是否缺少using 指令或程序集引用?) 1_main.aspx ,如何解决?
  • 您“缺少 using 指令”:您需要在代码文件顶部添加 using System.Linq;
  • 是的,我添加了,但问题仍然存在。仅在句子 WHERE
  • 那个奇怪,ListItemCollection实现了IEnumerable,对于Linq来说应该够用了。使用的两种扩展方法(Where 和 Select)都来自 Linq。你确定你添加正确(没有错误)?在 Visual Studio 中,您可以使用 Ctrl+.(控制和点)让它修复光标位置的一些问题 - 这有帮助吗?
  • 你提到了aspx。这有帮助吗:<%@ Import Namespace="System.Linq" %> 而不是using
【解决方案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;

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

【讨论】:

  • 谢谢你救了我的命
猜你喜欢
  • 2015-01-27
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多