我正在尝试通过包含我从数据库获取的国家/地区名称的列表框将值发送到存储过程。如果我选择一个选项代码则 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
列表图片:
请帮忙解决问题。
抱歉,如果问题重复,但我找不到解决方案。
你有这个:
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)
,因此当选择多个城市时,您可能会耗尽空间。
您只有一个参数,并且它是一个以逗号分隔的值字符串。
因此,您必须“构建”一个逗号分隔的字符串。像这样说:
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;
因此,您只传递一个值 - 但您必须构建要传递的值的“字符串”。