我已经提出了以下“模式”来从数据库中获取数据。 当然,我想检查是否可以建立连接,所以我需要使用try-catch块。 它工作正常但我很好奇是否有更好/更快/更安全的方式。
public List<T> GetAll(string sql)
{
var list = new List<T>();
var db = new SqlDatabase(Registry.Instance.CurrentConnectionString);
var cmd = new SqlCommand(sql);
IDataReader reader = null;
using (cmd)
{
try
{
reader = db.ExecuteReader(cmd);
}
catch (SqlException ex)
{
ShowExceptionError(ex);
return list;
}
}
using (reader)
{
while (reader.Read())
list.Add(GetMethod(reader));
reader.Close();
}
return list;
}
我知道最好的方法是在using块中声明dataReader,但是因为我需要try-catch块之外的引用而且我没有在using块之外引用它,我认为没关系。 / p>
答案 0 :(得分:0)
这纯粹是主观的,但我建议不要使用&#34;使用&#34;块,使用&#34; try / catch / finally&#34;块。像这样:
public List<T> GetAll(string sql)
{
var list = new List<T>();
SqlDatabase db = null;
SqlCommand cmd = null;
IDataReader reader = null;
try
{
db = new SqlDatabase(Registry.Instance.CurrentConnectionString);
cmd = new SqlCommand(sql);
reader = db.ExecuteReader(cmd);
while (reader.Read())
{
list.Add(GetMethod(reader));
}
}
catch (SqlException ex)
{
// Deal with sql exceptions
ShowExceptionError(ex);
return list;
}
catch (Exception ex)
{
// Deal with all other exceptions
ShowExceptionError(ex);
return list;
}
finally
{
if (db != null)
{
db.Dispose();
}
if (cmd != null)
{
cmd.Dispose();
}
if (reader != null)
{
reader.Dispose();
}
}
return list;
}
这里的想法是初始化try块内的所有内容,这样如果有任何失败,其中一个catch语句将处理它。我总是使用额外的catch(Exception e)
块来处理我无法预测的任何事情。无论代码是否成功执行或是否存在异常,finally
块都会发生。
此外,不需要关闭阅读器,因为Dispose方法将处理它。上面的代码未经过测试,某些部分可能会失败。问题可能是如果其中一个对象没有实现IDisposable接口,则无法在using
块中使用它,并且您无法处置它们。在这种情况下,只需将其从finally
块中删除。