当前位置: 首页 > 知识库问答 >
问题:

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

单于承
2023-03-14

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

谭骏
2023-03-14

你有这个:

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),因此当选择了多个城市时,您可能会耗尽空间。

 类似资料:
  • 问题内容: 我正在使用针对英特尔数学内核库构建的NumPy。我使用virtualenv,通常使用pip来安装软件包。 但是,为了让NumPy找到MKL库,有必要在编译之前先在NumPy源目录中创建site.cfg文件,然后手动进行构建和安装。我可以编写整个过程的脚本,但是我希望有一个更简单的解决方案。 我有一个标准的site.cfg文件,可在版本控制下用于此目的。是否有任何pip命令行选项会告诉它

  • 问题内容: 我想用 具有要求构造函数参数的Exception类型。像这样: 有没有一种方法可以创建一个将我的参数值传入的供应商? 问题答案: 当然。

  • 问题内容: 我正在使用JDK 1.6.0_26中的VisualVM来分析在Tomcat下运行的Java Webapp,但是VisualVM经常告诉我它没有足够的内存来拍摄快照,并使用-Xmx开关为Netbeans提供更多的内存。 。问题是,我在Netbeans之外运行VisualVM,那么如何为jvisualvm.exe提供JVM参数? 问题答案: 应该能够修改内存中的设置 并且在排队。

  • 标准中似乎没有规则提到模板参数需要默认参数的情况。 在dcl中。fct。默认值#1 如果在参数声明中指定了初始化子句,则将此初始化子句用作默认参数。缺省参数将用于缺少尾随参数的调用。 在本节中,规则明确描述了何时为函数调用提供默认参数。但是,我在标准中没有找到与上面描述何时提供默认参数作为模板参数的语句类似的引用。 例如

  • 问题内容: 我正在尝试为我的数据库实现一个非常基本的搜索引擎,其中用户可能包含各种信息。搜索本身包含几个联合选择,其中结果总是合并为3列。 但是,返回的数据是从不同的表中获取的。 每个查询都使用$ term进行匹配,并将其绑定到“:term”作为预备参数。 现在,该手册说: 调用PDOStatement :: execute()时,对于要传递给语句的每个值,必须包含一个唯一的参数标记。您不能在准备

  • 问题内容: 我经常碰巧处理可以是数组或null变量的数据,并用这些数据提供一些数据。 当为foreach提供非数组数据时,会收到警告: 警告:[…]中为foreach()提供了无效的参数 假设无法重构该函数以始终返回数组(向后兼容性,不可用的源代码,无论其他原因),我想知道哪种方法最有效,最有效的避免了这些警告: 转换为数组 初始化为数组 包裹有 其他(请建议) 问题答案: 我个人认为这是最干净的