2011-12-12 72 views
11

到现在我一直使用类似的结构,从数据库获取数据并填充一个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放入使用中是否是一种很好的做法?

感谢

干杯

+0

是时候。你的代码现在是正确的。始终处理实施IDisposable的类。但是SqlDataReader也是一次性的吗? – lnu

+0

你处理你返回的DataTable吗? – Kangkan

+0

我相信读者是一次性是的,也许这就是WRT表没有被处理的问题,因为它拥有一个并没有明确关闭的读者,尽管我希望当cmd被处置时它会被隐式关闭。 –

回答

7

你也应该这样做:

using (SqlDataReader reader = 
      cmd.ExecuteReader 
       (CommandBehavior.CloseConnection)) 
     { 
      table.Load(reader); 
     } 

加载表

+0

这是我第一次看到这种方法。为什么在MSDN上甚至没有提到类似的东西? – MaiOM

+0

这是一种选择。 MSDN只显示一个示例(简单)的情况。而且,是的,你也应该处理数据表。 – lnu

+0

那么因为我通常是Web应用程序,何时应该调用处理使用的DataTable?让我们说,在页面加载时,我将该方法调用关联到网格并绑定它。在哪里调用处置方法?谢谢 – MaiOM

3
  • 当它使用完这个方法应该调用DataTable的Dispose的调用者返回。
  • 是的,在内部使用SqlCommand是一种很好的做法。
+2

那么因为我通常是web应用程序,何时应该调用处理使用的DataTable?让我们说,在页面加载时,我将该方法调用关联到网格并绑定它。在哪里调用处置方法? 谢谢 – MaiOM

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); 
} 

不是说这是最佳解决方案,但它会解决投诉。