关闭可能尚未初始化的 SqlDataReader

Closing An SqlDataReader that might not have been initialized

我陷入了各种编译器错误的循环中,我需要一些帮助。

所以情况 1:在 try 块之外执行的 SqlDataReader 允许稍后关闭它,但是,reader 异常未处理。

var cmd = String.Format("SQL COMMAND HERE");
var command = new SqlCommand(cmd, conSQL);
SqlDataReader readerSql = command.ExecuteReader();  //Unhandled Exceptions here
try
{
    while (readerSql.Read())
    {....}
}
catch (SqlException e)
{...}
finally
{
    readerSql.Close(); //Compiler error: Might not have been initialized          
}

情况二:Reader在try块内执行,reader异常可以处理,但是reader异常不能关闭

SqlDataReader readerSql;
try{
    readerSql = command.ExecuteReader();
    while (readerSql.Read())
    {...}
    readerSql.Close(); //Does not close on exceptions
}
catch (SqlException e)
{
    readerSql.Close(); //Compiler error: Might not have been initialized
}
finally
{
    if(readerSql != null)  //Compiler Error on if statement, same as below
        readerSql.Close(); //Compiler error: Might not have been initialized    
}

使用using语句,它解决了你的问题:

using 语句确保即使在调用对象的方法时发生异常,也会调用 Dispose。

您可以使用 using 语句而不用担心关闭。

using(SqlDataReader readerSql = command.ExecuteReader()){
     try{
            while (readerSql.Read())
            {....}
        }
        catch (SqlException e)
        {
           //execption
        }
}

正如 Alioza 所说,最好的方法是 using 语句。

using (var readerSql  = command.ExecuteReader()) {
    while (readerSql.Read()) {
        {....}
    }
}

https://msdn.microsoft.com/en-us/library/yh598w02.aspx(使用语句文档)