gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:25:10 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com