为什么在MySQL更新语句中出现“连接已经打开”错误?
问题描述:
我正在用Winforms,MySQL和C#做一个大学出勤项目。为什么在MySQL更新语句中出现“连接已经打开”错误?
因为我想在一个表格中更新“Total Absent”和“Total Present”。所以我写了这样的代码:
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()
这引发错误“的连接已经打开”。如果我在循环之后放置更新语句,我只能得到最后一条记录。
请帮我更新每个“学生”的“Tot absent”,“Tot present”。
答
看着你R代码里面你已经取消了大部分的什么是不相关的打开或关闭连接后:
…
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
块中,以确保即使出现问题,连接也会关闭。
P.S:不要忘了.Dispose()
是IDisposable
(即数据读取器和连接对象)的所有对象,例如通过using
块。
答
您正在打开while循环之外的连接,然后尝试再次打开相同的连接,在while循环内创建一个新的连接或断开连接并执行需要完成的操作,然后关闭它。
答
您可以使用此检查连接的状态:
if (myConnection.State != ConnectionState.Open)
myConnection.Open();
,不要忘记使用try,catch和finally
finally
{
myConnection.Close();
}
使用2个不同的连接,一个更新和一个选择阅读器循环 –
谢谢。是我想使用差异连接只?或命令也?。 – Sagotharan
我不知道回滚。所以很不幸我点击。 – Sagotharan