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

问题描述 投票:1回答:2

我有个问题。我有一个名为“RollNoSlip”的表,其中有一个名为“AttendanceStatus”的列。我有名为“getAttendance”的列表变量,类型为“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();                                                                           
                    }
                }
            }
c# sql .net winforms ado.net
2个回答
2
投票

你得到所有'P's的原因是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();                                                                           
    }
}

0
投票

假设您使用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
© www.soinside.com 2019 - 2024. All rights reserved.