处理我需要从我的方法返回的数据表对象

时间:2014-02-19 07:07:51

标签: c# datatable dispose

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;

这段代码是否合法?...我的方法是返回那个datatable对象,所以在调用dispose之后会保留值??请解释..

3 个答案:

答案 0 :(得分:3)

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

如果您要返回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();
    }
}

注意我确实在您的代码段中看到了一些您未处理但应该处理的本地IDisposable个对象。您也在吞咽异常。

答案 1 :(得分:3)

这会给你你想要的东西:

    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;
        }
    }

答案 2 :(得分:1)

这将返回一个不符合你要求的被处置对象。

您可以做的一件事就是传递一个委托,这将允许您在不返回的情况下处理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
});