调试时,第一张图,这个时候可以清晰看到监视窗口,可以看到在 全局变量中的 _dataAdapter 已经被赋值,并且拥有其 SELECT 和 Connection。
可是奇怪的是,当我到了图1的地方时,按下F11进行下一步时,却发现 _dataAdapter 的内容丢失了(SELECT 和 Connection)。如图所示:我是左琢磨,右琢磨,也没执行什么 Dispose,怪哉怪哉,是不是我犯了什么失误?

解决方案 »

  1.   

    主要是因为中_dataAdapter 中保存的实际上是 临时变量query.DataAdapter 的地址,而不是真正的值,所以当执行完方法退出后,随着临时变量的析构,也就为null了
      

  2.   

    楼主567行的}肯定是方法结束的大括号了566的}匹配什么?莫非是这样
         using(DataAdapter _dataAdapter ...)
        {
                ...
           _dataAdapter = 
           return query;
    566 }所以dataAdapter被Dispose了?
      

  3.   

    我也是疑惑不已。
    反汇编如下:
    执行到黄色箭头处后,再下一步,便跳到下一个断点,在此时,数据仍然存在,但是跳到红点后,数据便丢失了。
    我可以肯定没有 执行DataAdapter.Dispose,析构函数也确认没有。所以我 才奇怪。
      

  4.   


    Fuck!!!原来是这样
            public DataSetResult<R, XXXDataAdapter, XXXCommand> ExecuteDataSet<R>(ExecuteArgs args) where R : DataSet, new()
            {
                R result = new R();
                Exception exception = null;
                using (XXXCommand command = this.CreateCommand(args))// <--这里
                {
                    XXXDataAdapter dataAdpater = this.CreateAdapter(command);
                    try
                    {
                        dataAdpater.Fill(result, args.TableName);
                    }
                    catch (Exception ex)
                    {
                        this.OnThrownException(ex, command);
                        exception = ex;
                    }
                    finally
                    {
                        command.Connection.TryClose();
                        Ex.WriteToDebug("ExecuteDataSet", command, result.ToString());
                    }
                    var query = new DataSetResult<R, XXXDataAdapter, XXXCommand>(dataAdpater, command, result, exception);
                    _dataAdapter = query.DataAdapter;
                    return query;
                }
            }崩溃……只顾着关注 DataAdapter 有没有被 Dispose,却忘了Command 这个玩意
      

  5.   

    你return的是query.是不是中间还做了其他的动作._dataAdapter是类的私有变量?还是贴全这段代码吧