到现在我一直使用类似的结构,从数据库获取数据并填充一个DataTable处置SQL命令,并关闭连接
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'不沿着所有异常路径放置。调用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放入使用中是否是一种很好的做法?
感谢
干杯
是时候。你的代码现在是正确的。始终处理实施IDisposable的类。但是SqlDataReader也是一次性的吗? – lnu
你处理你返回的DataTable吗? – Kangkan
我相信读者是一次性是的,也许这就是WRT表没有被处理的问题,因为它拥有一个并没有明确关闭的读者,尽管我希望当cmd被处置时它会被隐式关闭。 –