在打开的DataReader中执行另一个MySQL语句

时间:2014-05-14 20:38:53

标签: c# mysql sql wpf

我有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
              }
         }
     }
}

2 个答案:

答案 0 :(得分:2)

在您的样本中,您只需关闭阅读器并执行插入操作即可;

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插入行,如果它尚不存在。

答案 1 :(得分:2)

另一种选择是创建一个程序,它将像

一样完成所有这些任务
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参数。