使用C#中的if语句通过UPDATE更新特定行(SQL)

3
如果一门课程已满,则下一个学生将排在队列中,1、2、3等(0表示不在队列中,并且布尔值Accepted为true,表示该学生已经选上了这门课程)。如果一位学生退出了课程,则课程表中会有一个空位。
然而,使用C#和OleDbCommand,一旦课程表中有一个空位,我应该如何更新每个学生的行?我想让每个学生对于每个空位都减少1个值,如果处于队列#1(即将进入队列0的学生),我希望将其Accepted布尔值更新为true(表示该学生已经选上了这门课程)。
我的问题:
1. 我想为每个空位更新每个学生的队列索引为“-1”。
2. 当学生即将到达队列索引0时,我不知道如何更改特定学生的队列索引为1,使其布尔值Accepted=true
我不知道如何做到这一点,因为我不知道如何正确地结合数据库和C#。
这是我目前能够做到的:
以下第一段代码,我通过SELECT和reader计算了课程中的空位数量。
//-----------------------------   
//SELECT..... WHERE FreeSpots > 0...
int = QueueCount = 0;

while (reader.Read()) {
    QueueCount = ++QueueCount;
};     

//----------------------------
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
conn.Open();

OleDbCommand cmd = new OleDbCommand();

cmd.CommandText = "UPDATE [Course_Student] SET QueueIndex = @queueindex, Accepted = @accepted WHERE QueueIndex > 0 AND CID = " + CourseID + ";";

cmd.Connection = conn;

while (QueueCount > 0) {
    if (/*HELP: how do I check specific student with QueueIndex = 1?*/ == 1)
    {
        var pAccepted = new OleDbParameter("@accepted", SqlDbType.Bit);
        pAccepted.Value = true;
        cmd.Parameters.Add(pAccepted);
    } else {
        var pAccepted = new OleDbParameter("@accepted", SqlDbType.Bit);
        pAccepted.Value = false;
        cmd.Parameters.Add(pAccepted);
    }

    var pQueueIndex = new OleDbParameter("@queueindex", SqlDbType.Int);
    pQueueIndex.Value = /*HELP: for every row, --x QueueIndex for every students in queue*/;
    cmd.Parameters.Add(pQueueIndex);

    FreeSpot = --FreeSpot; //for later, to update freespots in course-table

    cmd.ExecuteNonQuery();
}

换句话说,我该如何在C#中使用OleDBCommand或其他方式,在更新之前检查特定值?是否有类似于Read.Reader方法的东西?我可以在其中检查每一行吗?说实话,我完全迷失了。

确保在查询中使用参数 - 您正在使用一些参数,但是CourseID仍然与您的SQL串联在一起 - 不要这样做! 也要为CourseID使用一个参数! - marc_s
好的,知道了,我会做的 :) - Nyprez
1个回答

3
改变你的SQL语句:
UPDATE [Course_Student] 
SET QueueIndex = QueueIndex - 1, 
    Accepted = (CASE QueueIndex WHEN 1 THEN 1 ELSE 0 END)
WHERE QueueIndex > 0 AND CID = @CourseID;

希望这能帮到您;

我收到了以下错误消息:查询表达式中的语法错误(缺少运算符):'(CASE QueueIndex WHEN 1 THEN 1 ELSE 0 END)'。浏览器指向 cmd.ExecuteNonQuery(); 我刚刚使用您提供的 CommandText 替换了原来的文本,还有其他事情我需要做吗? - Nyprez
哦,我弄清楚了,我正在使用Access数据库,它不支持CASE语句,相反我必须使用IFF代替(switch也可以),它们基本上很相似:UPDATE [Course_Student] SET QueueIndex = QueueIndex - 1, Accepted = IIF(QueueIndex = 1, 1, 0) WHERE QueueIndex > 0 AND CID = @CourseID;谢谢,没有你的帮助,我可能想不到这个。 - Nyprez
糟糕......睡过头了→_→...但很高兴听到你成功了,我以前不知道Access中的iif语句,谢谢你告诉我(^ω^) - baiyangcao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接