如何在异常时关闭DataReader

apa*_*cay 5 c# .net-1.1 sqlcommand sqldatareader

我的数据层的一些方法中有以下代码:

StringBuilder sb = new StringBuilder();
SqlCommand s = new SqlCommand(sb.ToString(), conn);
try 
{ 
    SqlDataReader dr = s.ExecuteReader(); 
    while(dr.Read())
      DoSomething(dr);
}
catch (Exception ex)
{ 
    sb.Append(Util.ExceptionRecursive(ex)); 
}
Run Code Online (Sandbox Code Playgroud)

事情是,博士永远不会在例外的情况下关闭.当其他方法试图访问另一个数据读取器时,它会抛出另一个异常,例如"另一个数据扩展器连接到数据库"

我想在任何情况下关闭我的DataReader.但是这个:

sb = new StringBuilder();
SqlCommand s = new SqlCommand(sb.ToString(), conn);
SqlDataReader dr;
try 
{
    dr = s.ExecuteReader(); 
    while(dr.Read())
      DoSomething(dr);
}
catch (Exception ex)
{ 
    sb.Append(Util.ExceptionRecursive(ex)); 
}
finally
{
    dr.Close();
}
Run Code Online (Sandbox Code Playgroud)

不会工作,因为如果异常dr可能没有数据,并且不会编译.

那我该怎么办?

SLa*_*aks 9

您应该使用以下using语句:
它生成一个finally块以确保始终处置您的资源.

StringBuilder sb = new StringBuilder();
using (SqlCommand s = new SqlCommand(sb.ToString(), conn)) {
    try 
    { 

        using (SqlDataReader dr = s.ExecuteReader()) {
            while(dr.Read())
              DoSomething(dr);
        }

    }
    catch (Exception ex)
    { 
        sb.Append(Util.ExceptionRecursive(ex)); 
    }    
}
Run Code Online (Sandbox Code Playgroud)

  • @apacay:`Dispose()`调用`Close()`.您应该为每个对象使用单独的"using"语句. (2认同)