我试图通过一个列表框将值发送到存储过程,该列表框包含我从数据库中获取的国家名称。如果我选择一个选项,代码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
列表图像:
请帮助解决这个问题。
对不起,如果问题重复了,但我找不到解决办法。
你有这个:
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)
,因此当选择了多个城市时,您可能会耗尽空间。