使用完令牌后,我试图从SQL数据库中删除令牌。
MySqlCommand cmdSel = new MySqlCommand("SELECT * FROM tokens WHERE token = " + int.Parse(passbox.Text), dbCon);
MySqlDataReader dbRead = cmdSel.ExecuteReader();
if (dbRead.Read())
{
int sqlkey = int.Parse(dbRead["token"].ToString());
if (keyint == sqlkey)
{
using (MySqlCommand delTok = new MySqlCommand("DELETE FROM tokens WHERE token = " + keyint, dbCon))
{
delTok.ExecuteNonQuery(); //MAIN PROBLEM HERE.
/*
MySql.Data.MySqlClient.MySqlException: 'There is already an open DataReader associated with this Connection which must be closed first.'
*/
//ERROR ^^^^^^
}
try
{
dbCon.Close();
loading loading = new loading();
loading.Show();
this.Hide();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
}
}
我必须关闭DataReader还是有其他方法,以及如何关闭阅读器?如果if keyint is sqlkey语句为true / done,我想删除令牌。错误仅在我尝试为if语句执行脚本时显示。“令牌”是一个int(10)
创建了一个新的私有void,并在if语句后使用令牌对其进行了调用。
private void delQuery(int token)
{
//SETUP CONNECTION
MySqlConnection dbConn = new MySqlConnection("some connection");
//OPEN CONNECTION
dbConn.Open();
//DELETE TOKEN
MySqlCommand delcmd = new MySqlCommand("DELETE FROM tokens WHERE token = " + token, dbConn);
MySqlDataReader dbReader = delcmd.ExecuteReader();
dbReader.Read();
//CLOSE CONNECTION
dbConn.Close();
}
使用它来调用:
if (dbRead.Read())
{
int sqlkey = int.Parse(dbRead["token"].ToString());
if (keyint == sqlkey)
{
dbCon.Close();
delQuery(keyint);
}
}
您必须先关闭阅读器才能执行另一个命令。另外,Db阅读器读取数据时无法执行命令。因此,您可以使用function或在关闭阅读器后执行命令。
MySqlCommand cmdSel = new MySqlCommand("SELECT * FROM tokens WHERE token = " + int.Parse(passbox.Text), dbCon);
int sqlkey=0;
MySqlDataReader dbRead = cmdSel.ExecuteReader();
if (dbRead.Read())
{
sqlkey = int.Parse(dbRead["token"].ToString());
}
reader.close();
if (keyint == sqlkey)
{
using (MySqlCommand delTok = new MySqlCommand("DELETE FROM tokens WHERE token = " + keyint, dbCon))
{
delTok.ExecuteNonQuery();
try
{
dbCon.Close();
loading loading = new loading();
loading.Show();
this.Hide();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
}
}