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之后会保留值??请解释..
答案 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
});