处理SQL命令并关闭连接
本文关键字:连接 SQL 命令 处理 | 更新日期: 2023-09-27 18:17:40
到目前为止,我一直使用类似的结构从DB获取数据并填充数据表
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。可靠性:在方法'TestService.GetByID(int)'中,对象'table'不会沿着所有异常路径进行处理。在对象'table'的所有引用都超出作用域之前,调用System.IDisposable.Dispose。
TestService.cs (42): CA2000: Microsoft。可靠性:在方法'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中是一个好做法吗?
感谢欢呼
你还应该这样做:
using (SqlDataReader reader =
cmd.ExecuteReader
(CommandBehavior.CloseConnection))
{
table.Load(reader);
}
加载表
- 这个方法的调用者应该在使用完这个方法后调用对返回的DataTable的dispose。
- 是的,这是一个很好的做法,将SqlCommand内使用。
要"修复"你的DataTable问题,也许你可以修改你的函数。
public static void GetByID(DataTable table, int testID)
{
// bla bla bla
}
// calling the function
using(DataTable table = new DataTable())
{
TestService.GetByID(table, 5);
}
不是说这是最优的解决方案,但它会解决投诉。