c# - 我如何使用 2 个 sql 命令和 1 个阅读器?

标签 c# mysql database winforms datareader

我正在尝试在使用 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/

相关文章:

c# - 转换为 c# 的 Excel 公式未给出相同的结果

c# - Toast 通知不起作用

c# - 为什么我的 CSS 没有被缩小?

javascript - 使用 jscript 节流函数包装即时搜索

php - 如何在查询结果中检查变量以更改同一查询的 while 循环?

database - 有谁知道一个很好的图书馆可以将一个人的名字映射到他或她的性别?

c# - 将数据行传递给表单并将控件绑定(bind)到它

php - MySQL语法错误,对我没有任何意义

sql - 如何避免关系数据库中的数组?

node.js - Mongoose 批量插入错误