C# 在使用数据读取器获取数据之前测试连接
我提出了以下从数据库获取数据的“模式”。 当然,我想检查是否可以建立连接,所以我需要使用try-catch块。 它工作正常,但我很好奇是否有更好/更快/更安全的方法C# 在使用数据读取器获取数据之前测试连接,c#,connection,try-catch,using,datareader,C#,Connection,Try Catch,Using,Datareader,我提出了以下从数据库获取数据的“模式”。 当然,我想检查是否可以建立连接,所以我需要使用try-catch块。 它工作正常,但我很好奇是否有更好/更快/更安全的方法 public List<T> GetAll(string sql) { var list = new List<T>(); var db = new SqlDatabase(Registry.Instance.CurrentConnectionString);
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;
}
公共列表GetAll(字符串sql)
{
var list=新列表();
var db=新的SqlDatabase(Registry.Instance.CurrentConnectionString);
var cmd=新的SqlCommand(sql);
IDataReader reader=null;
使用(cmd)
{
尝试
{
reader=db.ExecuteReader(cmd);
}
catch(SqlException-ex)
{
ShowExceptionError(ex);
退货清单;
}
}
使用(读卡器)
{
while(reader.Read())
添加(GetMethod(reader));
reader.Close();
}
退货清单;
}
我知道最好的方法是在using块中声明dataReader,但是因为我需要try-catch块之外的引用,并且我不在using块之外引用它,所以我认为这很好。这纯粹是主观的,但是我建议不要使用“using”块,而是使用“try/catch/finally”块。大概是这样的:
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;
}
公共列表GetAll(字符串sql)
{
var list=新列表();
SqlDatabase db=null;
SqlCommand cmd=null;
IDataReader reader=null;
尝试
{
db=新的SqlDatabase(Registry.Instance.CurrentConnectionString);
cmd=新的SqlCommand(sql);
reader=db.ExecuteReader(cmd);
while(reader.Read())
{
添加(GetMethod(reader));
}
}
catch(SqlException-ex)
{
//处理sql异常
ShowExceptionError(ex);
退货清单;
}
捕获(例外情况除外)
{
//处理所有其他例外情况
ShowExceptionError(ex);
退货清单;
}
最后
{
如果(db!=null)
{
db.Dispose();
}
如果(cmd!=null)
{
cmd.Dispose();
}
if(读卡器!=null)
{
reader.Dispose();
}
}
退货清单;
}
这里的想法是初始化try块内的所有内容,这样,如果任何内容失败,其中一个catch语句将处理它。我总是使用一个额外的catch(异常e)
块来处理我没有预测到的任何事情。无论代码是否成功执行或是否存在异常,finally
块都将在这两种情况下发生
此外,不需要关闭读取器,因为Dispose方法将处理它。上面的代码没有经过测试,有些部分可能会失败。问题可能是,如果其中一个对象未实现IDisposable接口,则无法在
using
块中使用该接口,也无法处置它们。在这种情况下,只需将其从finally
块中删除即可。这纯粹是主观的,但我建议使用“try/catch/finally”块,而不是使用“using”块。大概是这样的:
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;
}
公共列表GetAll(字符串sql)
{
var list=新列表();
SqlDatabase db=null;
SqlCommand cmd=null;
IDataReader reader=null;
尝试
{
db=新的SqlDatabase(Registry.Instance.CurrentConnectionString);
cmd=新的SqlCommand(sql);
reader=db.ExecuteReader(cmd);
while(reader.Read())
{
添加(GetMethod(reader));
}
}
catch(SqlException-ex)
{
//处理sql异常
ShowExceptionError(ex);
退货清单;
}
捕获(例外情况除外)
{
//处理所有其他例外情况
ShowExceptionError(ex);
退货清单;
}
最后
{
如果(db!=null)
{
db.Dispose();
}
如果(cmd!=null)
{
cmd.Dispose();
}
if(读卡器!=null)
{
reader.Dispose();
}
}
退货清单;
}
这里的想法是初始化try块内的所有内容,这样,如果任何内容失败,其中一个catch语句将处理它。我总是使用一个额外的catch(异常e)
块来处理我没有预测到的任何事情。无论代码是否成功执行或是否存在异常,finally
块都将在这两种情况下发生
此外,不需要关闭读取器,因为Dispose方法将处理它。上面的代码没有经过测试,有些部分可能会失败。问题可能是,如果其中一个对象未实现IDisposable接口,则无法在using
块中使用该接口,也无法处置它们。在这种情况下,只需将其从finally
块中删除即可