2017-07-17 32 views
0

我有一个Windows窗体应用程序在C#中具有一个按钮运行这样的代码:C#中,我守捉一个多个MySQL读者异常时,只有1读卡器

private void aCertainButton_Click(object sender, EventArgs e) 
{ 
    if (folderFinder.ShowDialog() == DialogResult.OK) 
    { 
     if (openConnection()) 
     { 
      foreach (Thingy stuff in aCertainCollection) 
      { 
       string sqlCommandString = "SELECT COUNT(*) FROM thatTable WHERE someField = " + stuff.property + ";"; 
       try 
       { 
        MySqlCommand count = new MySqlCommand(sqlCommandString, connection); 
        int rowCount = 0; 
        object o = count.ExecuteScalar(); 
        if (o != null) 
        { 
         rowCount = int.Parse(o.ToString()); 
        } 

        if (rowCount == 1) 
        { 
         MySqlCommand cmd = new MySqlCommand("SELECT * FROM thatTable WHERE someField = " + stuff.property + ";", connection); 
         MySqlDataReader reader = cmd.ExecuteReader(); 

         //Processing stuff from the reader here 

         reader.Close(); 
         reader.Dispose(); 
        } 
       } 
       catch (MySqlException mex) 
       { 
        Console.WriteLine(mex.Message); 
       } 
      } 
      closeConnection(); 
     } 
    } 
} 

任何时候我跑该应用程序捕获以下异常:“已经有一个与此连接关联的打开的DataReader,必须先关闭它。”

但不应该有。我在这段代码中使用了1个阅读器,并且没有其他东西异步运行。正如你所看到的,我关闭了阅读器,并在循环中的每次迭代之后打开一个新阅读器。我在应用程序的初始化过程中使用了与相同连接关联的阅读器,但是在完成数据处理后,关闭它并处理它。

我很感谢任何人都可以帮助我解决这个谜,谢谢。

+0

你的代码是SQL注入漏洞可能开:

当你需要确保它的东西在例外的情况下,甚至使用后,再使用using clausule配置。请阅读并使用参数化查询。 –

+0

看起来你正在使用全局连接。是否有可能在您打开代码中的第一个之前打开了一个阅读器?我强烈建议在需要时创建连接,并确保将所有可丢弃对象放在'using'语句中。 https://msdn.microsoft.com/en-us/library/ms971481.aspx#adonetbest_topic5 – juharr

+0

@Daniel Mann谢谢,但这是一个小型的实用程序应用程序,我只为自己写。一切都完全是本地的。我认为问题必须是本地的,而不是来自攻击者。 –

回答

3

在你的代码中,如果某个东西在名为“processing stuff”的零件上生成了一个异常,那么你将会让阅读器处于打开状态。

if (rowCount == 1) 
{ 
    MySqlCommand cmd = new MySqlCommand("SELECT * FROM thatTable WHERE someField = " + stuff.property + ";", connection); 
    using(MySqlDataReader reader = cmd.ExecuteReader()) 
    { 

     //Processing stuff from the reader here 

    } 
} 
+0

这正是发生了什么事情,您的解决方案完美无缺。谢谢。 –