代码之家  ›  专栏  ›  技术社区  ›  Waqas Qureshi

如何用c#中的不同值更新数据库中的多行?

  •  1
  • Waqas Qureshi  · 技术社区  · 7 年前

    我有个问题。我有一个名为“RollNoSlip”的表,其中有一列名为“AttendanceStatus”。我有一个名为“getAttention”的列表变量,类型为“list<string>”。我想将每个值分配给“RollNoSLip”的每个记录。考勤栏可以包含“P”或“A”。问题是它在所有记录中只显示P。为什么?

    var getAttendance = (from r in db.RollNoSlips
                                     from a in db.Attendances
                                     where r.RollNo == a.RollNo
                                     select a.AttendanceStatus).ToList();
    using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["IQTSConnectionString"].ConnectionString))
                {
                    con.Open();
                    using (var cmd = new SqlCommand("update RollNoSlip set AttendanceStatus=@Attendance where RollNo between  10001 and 10045", con))
                    {
                        cmd.Parameters.Add("@Attendance", SqlDbType.VarChar);
                        for (int i = 0; i < getAttendance.Count; i++)
                        {
                            cmd.Parameters["@Attendance"].Value = getAttendance[i];
                            cmd.ExecuteNonQuery();                                                                           
                        }
                    }
                }
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Sergey Kalinichenko    7 年前

    你得到一切的原因 'P' 这是 getAttendance 列表碰巧有 “P” 。是不是 'A' ,所有记录都将设置为 “A”

    您需要单独处理项目,将其ID传递给SQL:

    // Include RollNo in getAttendance list
    var getAttendance = (from r in db.RollNoSlips
                         from a in db.Attendances
                         where r.RollNo == a.RollNo
                         select new {a.AttendanceStatus, a.RollNo}
    ).ToList();
    ...
    // Updates getAttendance rows in the database, one row at a time
    using (var cmd = new SqlCommand("update RollNoSlip set AttendanceStatus=@Attendance where RollNo=@RollNo", con))
    {
        cmd.Parameters.Add("@Attendance", SqlDbType.VarChar);
        cmd.Parameters.Add("@Attendance", SqlDbType.Int);
        for (int i = 0; i < getAttendance.Count; i++)
        {
            cmd.Parameters["@Attendance"].Value = getAttendance[i].AttendanceStatus;
            cmd.Parameters["@RollNo"].Value = getAttendance[i].RollNo;
            cmd.ExecuteNonQuery();                                                                           
        }
    }
    
        2
  •  0
  •   Jonni Chan    7 年前

    假设您使用SQL Server,然后使用下面的查询更新AttendanceStatus。

    UPDATE RollNoSlip SET
      AttendanceStatus = A.AttendanceStatus
    FROM RollNoSlip R
    INNER JOIN Attendance A ON R.RollNo = A.RollNo
    WHERE R.RollNo BETWEEN 10001 AND 10045