C# 正在处理SQL命令并关闭连接
到目前为止,我一直使用类似的结构从数据库中获取数据并填充数据表C# 正在处理SQL命令并关闭连接,c#,sql,dispose,C#,Sql,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 Sq
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。可靠性:在方法“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中是一种好的做法吗
谢谢
干杯
public static void GetByID(DataTable table, int testID)
{
// bla bla bla
}
// calling the function
using(DataTable table = new DataTable())
{
TestService.GetByID(table, 5);
}
不是说这是最佳解决方案,但它会解决投诉。您还应该这样做:
using (SqlDataReader reader =
cmd.ExecuteReader
(CommandBehavior.CloseConnection))
{
table.Load(reader);
}
加载表格时是。您的代码现在是正确的。始终处置实现IDisposable的类。但是SqlDataReader也是一次性的吗?您是否处理您返回的DataTable?我相信读卡器是一次性的是的,也许这就是表未被处理的问题,因为它包含一个未显式关闭的读卡器,虽然我希望在释放cmd时它会被隐式关闭,但您应该这样做:使用(SqlDataReader=command.ExecuteReader(CommandBehavior.CloseConnection)){dt.Load(reader);}@Kangkan什么意思是释放DataTable然后返回?我返回那个数据表,我不能在那里处理它。因为我的应用程序通常是web应用程序,我应该在什么时候调用对使用过的数据表的处理?假设在页面加载时,我将该方法调用与网格关联并绑定它。在哪里调用dispose方法?ThanksIt是我第一次看到这种方法。为什么MSDN上没有提到类似的内容?这是一种选择。MSDN仅显示了一个示例(简单)案例。是的,您也应该处理数据表。我的应用程序通常是web应用程序,我应该在什么时候调用已用数据表的处理?假设在页面加载时,我将该方法调用与网格关联并绑定它。在哪里调用dispose方法?感谢如果您将它与datagrid或gridview一起使用,那么没有好的方法来处理它,您可以保持原样。只有当您处于另一个上下文(如果datatable未直接绑定到控件)中时,才可以进行处置。此外,看起来(谷歌搜索)datatable中没有非托管资源,尽管它实现了IDisposable。