到目前为止,我总是使用类似的结构从DB获取数据并填充DataTable
public static DataTable GetByID(int testID)
{
DataTable table = new DataTable();
string query = @"SELECT * FROM tbl_Test AS T WHERE T.testID = @testID";
using (SqlConnection cn = new SqlConnection(Configuration.DefaultConnectionString))
{
SqlCommand cmd = new SqlCommand(query, cn);
cmd.Parameters.Add("@testID", SqlDbType.Int).Value = testID;
cn.Open();
table.Load(cmd.ExecuteReader());
}
return table;
}
现在我在构建分析中看到了一些警告:
TestService.cs(37):CA2000:Microsoft.Reliability:在方法'TestService.GetByID(int)'中,对象'table'未沿所有异常路径放置。在对对象'table'的所有引用超出范围之前,调用System.IDisposable.Dispose。
TestService.cs(42):CA2000:Microsoft.Reliability:在方法'TestService.GetByID(int)'中,在对所有引用超出范围之前,在对象'cmd'上调用System.IDisposable.Dispose。
我应该在
中更改我的代码 public static DataTable GetByID(int testID)
{
DataTable table = new DataTable();
string query = @"SELECT * FROM tbl_Test AS T WHERE T.testID = @testID";
using (SqlConnection cn = new SqlConnection(Configuration.DefaultConnectionString))
{
using (SqlCommand cmd = new SqlCommand(query, cn))
{
cmd.Parameters.Add("@testID", SqlDbType.Int).Value = testID;
cn.Open();
table.Load(cmd.ExecuteReader());
}
}
return table;
}
如何处理DataTable对象? 将SqlCommand放在using?
中是一个好习惯由于
干杯
答案 0 :(得分:7)
你也应该这样做:
using (SqlDataReader reader =
cmd.ExecuteReader
(CommandBehavior.CloseConnection))
{
table.Load(reader);
}
加载表时
答案 1 :(得分:3)
答案 2 :(得分:1)
要使用DataTable“修复”您的问题,也许您可以修改您的功能。
public static void GetByID(DataTable table, int testID)
{
// bla bla bla
}
// calling the function
using(DataTable table = new DataTable())
{
TestService.GetByID(table, 5);
}
不是说这是最佳解决方案,但它会解决投诉。