2016-04-23 151 views
3

如果某个课程已满,则下一个学生将排队等待1,2,3等。(0 =不在行,并且布尔值为Accepted是真的,这意味着学生在课程中)。如果学生退出课程,课程表中将有一个免费点。使用C#中的if语句通过UPDATE更新特定的行(sql)

但是,如果使用C#和OleDbCommand,一旦课程表有空位,我如何更新每个学生行?我希望每个学生为每个免费点获得1个值,如果学生在1号队列中(即将达到0号队列),我希望它将Accepted布尔值更新为true(意味着学生在课程中)。

我的问题:

  1. 我想更新每一个学生队列指数“--1”每个自由点。

  2. 我不知道如何改变特定学生,以队列索引1,为布尔Accepted = true,当学生即将袭击队列索引0

我不知道如何这样做,因为我不知道如何正确地结合数据库和C#。

这是我能走多远:

下面的第一个代码,我通过SELECT计的游离点的过程和读者

//----------------------------- 
//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的方法?我可以在哪里检查每一行?说实话,我完全迷失在这里。

+0

确保为您的查询使用**参数**您正在使用一些参数,但是“CourseID”仍然与您的SQL一起串联 - **请勿这样做!**使用参数'CourseID'以及! –

+0

啊,很高兴知道,将做:) – Nyprez

回答

2

改变你的SQL语句:

UPDATE [Course_Student] 
SET QueueIndex = QueueIndex - 1, 
    Accepted = (CASE QueueIndex WHEN 1 THEN 1 ELSE 0 END) 
WHERE QueueIndex > 0 AND CID = @CourseID; 

希望这可以帮助;

+0

我得到此错误消息:语法错误(缺少运算符)在查询表达式'(CASE QueueIndex WHEN 1 THEN 1 ELSE 0 END)“。 浏览器指向cmd.ExecuteNonQuery(); 我刚刚用你的CommandText取代了,还有什么我要做的吗? – Nyprez

+0

哦,我想通了,我使用Access数据库,它不支持CASE,而不是我必须使用IFF(切换作品),非常相似: 'UPDATE [Course_Student] SET QueueIndex = QueueIndex - 1 , Accepted = IIF(QueueIndex = 1,1,0) WHERE QueueIndex> 0 AND CID = @CourseID; ' 谢谢,如果没有你的帮助,我不会理解它。 编辑:baah不能换一个新的行,试着用2个空格+
,pre等.. – Nyprez

+0

opps ...... oversleep→_→...但很高兴听到你做到了,我不知道在访问之前的iif声明,感谢告诉我(* ^ω^ *) – baiyangcao