我试图用列表框和文本框中的值来更新数据库表,但是异常被抛出了异常。
过程或函数需要参数,但未提供该参数。
即使在提供参数之后也会抛出。我希望选定的课程显示在数据库表的同一列中,用逗号分隔。这就是我到目前为止所拥有的。
using (SqlCommand com = new SqlCommand("updateStudent", connection))
{
com.CommandType = CommandType.StoredProcedure;
com.Parameters.AddWithValue("@studentNum", studentNum.Text);
com.Parameters.Add("@studentName", SqlDbType.NVarChar).Value = studentName.Text;
foreach (ListItem item in lstCourse.Items)
{
if (item.Selected)
{
com.Parameters.Add("@courses", SqlDbType.NVarChar).Value = " " + item.Text + " ";
}
}
com.ExecuteNonQuery();
com.Parameters.Clear();
}
}
发布于 2018-08-11 04:36:13
而不是foreach循环,您应该这样做
// create comma separated list of selected courses
var courses = string.Join(",", lstCourse.Items
.Where(item=>item.Selected)
.Select(s=>s.Text)
.ToList());
// add courses as parameter
com.Parameters.Add("@courses", SqlDbType.NVarChar).Value = courses;
在阅读了您在下面分享了过程代码的注释之后,更新。
update Student
set studentNum=@studentNum,studentName=@studentName,courses=@courses
where studentId=@studentId`
您似乎没有将@studentId
作为参数传递。这可能是出现错误消息的原因
过程或函数需要参数,但未提供该参数。
因此您应该将此参数添加到sql命令中
com.Parameters.Add("@studentId", SqlDbType.Int).Value = studentId; -- update the dbtype and variable as per your system.
发布于 2018-08-11 04:39:55
错误是正常的
对于存储过程的调用,不能多次发送具有相同名称的参数。
如果需要将课程列表保存到学生实体,则必须更改数据库的结构,并使用带有指向学生表的外键的新表。
请查看此文档Foreing Key、Store Procedure
发布于 2018-08-11 06:27:01
我认为@Vinit有正确的答案来做你想做的事情。你想要这个来代替你的foreach (ListItem item in lstCourse.Items)
。
// create comma separated list of selected courses
var courses = string.Join(",", lstCourse.Items
.Where(item=>item.Selected)
.Select(s=>s.Text)
.ToList());
// add courses as parameter
com.Parameters.Add("@courses", SqlDbType.NVarChar).Value = courses;
它构建逗号分隔的课程名称列表,然后将其作为一个参数@courses放入命令中。
然而!!在这样做了大约20年之后,我可以告诉你,你不会真的喜欢这样做的。您将希望学生选择的课程位于不同的记录中。每次你要处理这些课程时,你都要处理这些课程名称的集合。在这种情况下,我所做的是创建一个单独的表,将学生加入到“多对多”关系中的课程。顺便说一句,我在你的代码中看不到你告诉命令执行哪个SP的地方。
麦克
https://stackoverflow.com/questions/51791871
复制相似问题