我陷入了不同编译错误的循环中,我需要一些帮助。
所以情况1:在try块之外执行的SqlDataReader允许稍后关闭它,但是,将读者的例外保留为无法处理。
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
}
案例2:读取器在try块内执行,读者异常可以处理,但读者不能在异常时关闭。
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
}
答案 0 :(得分:3)
使用using声明,它解决了您的问题:
using语句确保即使在对象上调用方法时发生异常,也会调用Dispose。
答案 1 :(得分:1)
正如Alioza所说,最好的方法是使用声明。
using (var readerSql = command.ExecuteReader()) {
while (readerSql.Read()) {
{....}
}
}
https://msdn.microsoft.com/en-us/library/yh598w02.aspx(使用声明文档)
答案 2 :(得分:0)
您可以使用using
语句,而不用担心结束。
using(SqlDataReader readerSql = command.ExecuteReader()){
try{
while (readerSql.Read())
{....}
}
catch (SqlException e)
{
//execption
}
}