【问题标题】:how to update database table with listbox values using c#如何使用 C# 使用列表框值更新数据库表
【发布时间】:2018-08-10 18:03:55
【问题描述】:

我正在尝试使用列表框中的值以及文本框的值来更新数据库表,但是抛出了异常 例外。

过程或函数需要参数,但未提供。

即使在提供参数后也会抛出。我希望选择的课程显示在数据库表的同一列中,用逗号分隔。 这是我目前所拥有的。

 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();
       }
   }

【问题讨论】:

  • 您正在添加多个 @courses 参数,这可能不是您想要做的。参数@courses 中期望的存储过程是什么?您可能需要稍微不同地构造该参数的值。
  • 如果您选择超过 1 个项目,那么您会收到此错误吗?过程或函数 updateStudent 指定的参数过多。
  • 更新学生集 studentNum=@studentNum,studentName=@studentName,courses=@courses where studentId=studentId
  • @jeffld 是的,就是这样
  • @jeffld;你能帮忙吗

标签: c# asp.net stored-procedures


【解决方案1】:

错误是正常的

您不能多次发送同名参数来调用存储过程。

如果您需要将课程列表保存到学生实体,则必须更改数据库的结构,并为学生表使用具有外键的新表。

查看此文档 Foreing Key , Store Procedure

【讨论】:

    【解决方案2】:

    我认为@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 的地方。

    迈克

    【讨论】:

      【解决方案3】:

      你应该这样做,而不是 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;
      

      更新 在阅读了您共享以下程序代码的其中一个 cmets 之后。

      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.
      

      【讨论】:

      • 这是一个错误,它应该是 studentNum 而不是 studentId。所以我正在为它提供参数;抛出错误消息的课程提供了太多参数
      猜你喜欢
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 2020-08-20
      • 2011-02-27
      • 2012-12-02
      • 1970-01-01
      相关资源
      最近更新 更多