【问题标题】:Dispose datatable object which i need to return from my method处理我需要从我的方法返回的数据表对象
【发布时间】:2014-03-19 08:49:12
【问题描述】:
DataTable dt= new Datatable();
try {
    SqlCommand Cmd = new SqlCommand("sp_getData",SqlCon);
    SqlCommand.CommandType= CommandType.StroedProcedure;
    SqlCon.Open();
    sqlDataReader dr=  cmd.ExecuteReader();
    dt.Load(dr);
    SqlCon.Close();
}
catch(Exception ex) {
}
finally{
    dt.Dispose() //
}

return dt;

这段代码合法吗?...我的方法正在返回该数据表对象,所以在调用 dispose 后会保留该值吗??...请解释一下..

【问题讨论】:

  • 您是否尝试在那段代码中解决尽可能多的问题?请阅读IDisposableusing blocks。你让你的当地人不被处理,你处理了你唯一要返回的东西。
  • 任何人都出来了??..请说出你的建议....
  • 这是不合法的。看到这个姿势 - stackoverflow.com/questions/18869079/…
  • 再做一次改变!将您的 SqlCon.Close() 放在 finally 中,因为如果您遇到一些错误,例如使用 ExecuteReader,您的连接将不会关闭。

标签: c# datatable dispose


【解决方案1】:

没有。您将返回一个已处置的对象。

如果你返回一个IDisposable,那么期望调用者在处理完对象时有责任处理它是完全正常的。因此,您应该按原样返回 DataTable 对象,未处理,并让调用代码处理它。

通常这将使用 using 块来完成。例如:

class MyDisposableObject : IDisposable { /*...*/ }

public MyDisposableObject MakeMeAnObject() { return new MyDisposableObject(); }

public void Main()
{
    using(var o = MakeMeAnObject())
    {
        o.Foo = 1;
        o.Bar = 2;
        o.FooBar();
    }
}

请注意,我确实在您的 sn-p 中看到了一些本地 IDisposable 对象,这些对象您没有处理但应该处理。你也在吞咽异常。

【讨论】:

    【解决方案2】:

    这会给你你想要的:

        public DataTable getDataTable()
        {
            using (SqlConnection sqlCon = new SqlConnection("connectionString"))
            using (SqlCommand cmd = new SqlCommand("sp_getData", sqlCon))
            {
                try
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    sqlCon.Open();
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        DataTable dt = new DataTable();
                        dt.Load(dr);
                        return dt;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                return null;
            }
        }
    

    【讨论】:

      【解决方案3】:

      这将返回一个不是您想要的已处置对象。

      您可以做的一件事是传递一个委托,这将允许您在 DataTablr 上工作而不返回它,并且仍然在您的原始数据方法中进行处理。

      伪代码:

      public void GetSomeData(Action<DataTable> processDataTableAction)
      {
          try
          { 
              ... ( get the data )
              processDataTableAction(dt);
          }
          catch
          {
              // handle exceptions
          }
          finally
          {
              dt.Dispose();
          }
      }
      

      然后在代码的其他地方调用函数:

      GetSomeData(dt => {
          // do stuff with dt
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        相关资源
        最近更新 更多