我正在尝试在使用 token 后将其从我的 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 语句为真/完成后删除 token 。仅当我尝试执行 if 语句的脚本时才会显示错误。 “ token ”是一个 int(10)
最佳答案
连接仅允许一个打开的阅读器。
您可以通过仅执行一个“删除”查询来解决两个数据读取器的问题。
如果找到 token ,查询将删除它,如果没有,查询将不执行任何操作。
using (var connection = new MySqlConnection("connection-string"))
using (var command = connection.CreateCommand())
{
command.CommandText = "DELETE FROM tokens WHERE token = @token";
var token = new MySqlParameter
{
ParameterName = "@token",
MySqlDbType = MySqlDbType.Int32,
Value = int.Parse(passbox.Text)
};
command.Parameters.Add(token);
connection.Open();
command.ExecuteNonQuery();
}
不要尝试“保持”连接,只需在每次需要时处理旧的并创建新的即可。 ADO.NET 在后台有效地重用已打开的实际连接。
使用 SQL 参数将值传递给查询。 Sql 参数通过重用预编译的查询计划来防御 SQL 注入(inject)并提高 SQL 查询性能。
关于c# - 我如何使用 2 个 sql 命令和 1 个阅读器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59726366/