在打开的DataReader中执行另一条MySQL语句
本文关键字:一条 MySQL 语句 执行 DataReader | 更新日期: 2023-09-27 18:03:19
我有一个WPF应用程序,它使用MySQL连接与数据库一起工作。我有一个特定的查询,检查我的输入信息是否具有数据库中已经存在的唯一id。如果有,我什么都不用做如果没有,我就需要在那里插入一条新记录。下面是我的代码。问题是,在我尝试创建和执行新命令的最后一个using语句中,我得到一个错误,说"这个连接已经存在一个开放的DataReader"。
通过它的外观,我需要建立一个不同的连接并使用它,但是否有一个工作,而不是使用当前的连接?
using (MySqlCommand checkCmd = con.CreateCommand())
{
checkCmd.CommandText = "SELECT id FROM table WHERE id = @RFID";
checkCmd.Parameters.AddWithValue("RFID", myValue);
using (MySqlDataReader reader = checkCmd.ExecuteReader())
{
//if not found, then insert the new value in the database
if (!reader.Read())
{
using (MySqlCommand cmd = con.CreateCommand())
{
//try to create and execute insert query here
}
}
}
}
在您的示例中,您可以简单地关闭阅读器并执行insert;
bool found;
using (MySqlCommand checkCmd = con.CreateCommand())
{
checkCmd.CommandText = "SELECT id FROM table WHERE id = @RFID";
checkCmd.Parameters.AddWithValue("RFID", myValue);
using (MySqlDataReader reader = checkCmd.ExecuteReader())
{
found = reader.Read();
}
}
if(!found) {
using (MySqlCommand cmd = con.CreateCommand())
{
//try to create and execute insert query here
}
}
如果id
应该是唯一的,另一个可能的选择是根本不做选择,只是在id
上设置一个唯一索引,并使用INSERT IGNORE
插入行,如果它不存在。
另一个选择是创建一个过程,它将一次完成所有这些任务,如
create procedure insertifnotexist @rfid int,@someothercolumn varchar(10)
as
begin
declare @tabid int;
SELECT @tabid = id FROM table WHERE id = @rfid;
if(@tabid = '')
insert into table values(@rfid,@someothercolumn);
end
然后从代码中调用这个过程,传递@RFID参数。