关闭可能尚未初始化的 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(使用语句文档)
我陷入了各种编译器错误的循环中,我需要一些帮助。
所以情况 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(使用语句文档)