代码之家  ›  专栏  ›  技术社区  ›  Jürgen Steinblock

亚音速:MySqlDataReader关闭连接

  •  0
  • Jürgen Steinblock  · 技术社区  · 15 年前

    我使用的是亚音速2.1,在执行事务时遇到了一个问题

    SharedDbConnectionScope和TransactionScope。

    // Loads a SubSonic ActiveRecord object
    User user = new User(User.Columns.Username, "John Doe");
    

    在这个用户类的构造函数中,调用了一个方法“LoadParam”,它最终会

    if (rdr != null)
        rdr.Close();
    

    我的问题是这是设计的还是MySqlDataReader中的错误。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Jürgen Steinblock    15 年前

    那太棘手了! 经过一点调试后,我在SubSonic2 MySqlDataReader.cs文件中找到了以下方法:

        public override IDataReader GetReader(QueryCommand qry)
        {
            AutomaticConnectionScope conn = new AutomaticConnectionScope(this);
    
            ...
    
            cmd.Connection = (MySqlConnection)conn.Connection;
    
            IDataReader rdr;
    
            try
            {
                rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch(MySqlException x)
            {
                conn.Dispose();
                throw x;
            }
    
            ...
        }
    

    这是错误的,因为我使用的是SharedDbConnection。在SqlDataProvider中,它已经被修复了,但对于MySqlDataReader来说不是。

    应该是这样的:

            try
            {
                // if it is a shared connection, we shouldn't be telling the reader to close it when it is done
                rdr = conn .IsUsingSharedConnection ?
                          cmd.ExecuteReader() : 
                          cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (MySqlException)
            {
                // AutoConnectionScope will figure out what to do with the connection
                conn.Dispose();
                //rethrow retaining stack trace.
                throw;
            }
    

    相当严重的bug,它使得事务中的查询变得不可能(我必须承认我以前从未需要过这个)。

    推荐文章