我正在用Winforms、MySQL和c#做一个大学出勤率项目。
我想在一个表中更新"总缺席"one_answers"总出席"。我为此写了代码:
int p = 0;
int a = 0;
string sno = "";
MySqlDataReader Reader;
command.CommandText = "select * from attendance_monthly_rpt";
connection.Open();
Reader = command.ExecuteReader();
while (Reader.Read())
{
p = 0;
a = 0;
sno = Reader[1].ToString();
for (int k = 3; k <= 33; k++)
{
if ((Reader[k].ToString() == "P") || (Reader[k].ToString() =="OD"))
{
p += 1;
}
else if (Reader[k].ToString() == "Ab")
{
a += 1;
}
}
}
connection.Close();
现在我得到了"sno", "a", "p"值。但是我想在MySQL表中更新这条记录。所以我添加了一个UPDATE
语句:
while (Reader.Read())
{
p = 0;
a = 0;
sno = Reader[1].ToString();
for (int k = 3; k <= 33; k++)
{
if ((Reader[k].ToString() == "P") || (Reader[k].ToString() =="OD"))
{
p += 1;
}
else if (Reader[k].ToString() == "Ab")
{
a += 1;
}
}
command.CommandText = "update attendance_monthly_rpt set tot_persent = " +
p + ", tot_absent = " + a + " where student_no = '" +
sno + "'";
connection.Open(); // the connection is already open
command.ExecuteNonQuery();
connection.Close();
}
connection.Close()
这会抛出错误"连接已经打开"。如果我把update语句放在循环之后,我只得到最后一条记录。
请帮我更新每个"学生"的"Tot absent","Tot present"。
你可以用它来检查连接的状态:
if (myConnection.State != ConnectionState.Open)
{
myConnection.Open();
}
,不要忘记使用try, catch和finally
finally
{
myConnection.Close();
}
删除大部分与打开或关闭连接无关的内容后,查看代码:
…
connection.Open(); // <--------------+
… // |
// |
while (…) // |
{ // |
… // |
connection.Open(); // the connection is already open
…
connection.Close(); // <--------------+
} // |
connection.Close() // likewise, it'll already be closed here
现在很容易看出为什么在while
循环第一次运行时连接已经打开。
适当:我建议您不要 .Open()
和.Close()
连接每一个命令。(除非必要,否则不应该保持联系,但你可能有点夸张了。:)相反,在开始更新之前打开连接一次,并在while
循环后关闭它。并且,就像CodeBuzz已经建议的那样,将connection.Close()
放在finally
块中,以确保即使出现问题也关闭连接。
注::不要忘记.Dispose()
所有的对象是IDisposable
(即。数据读取器和连接对象),例如通过using
块。
您在while循环外打开连接,然后尝试再次打开相同的连接,在while循环内创建新连接,或者保持连接打开并做需要做的事情,然后关闭它