C# 在使用数据读取器获取数据之前测试连接

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);

我提出了以下从数据库获取数据的“模式”。 当然,我想检查是否可以建立连接,所以我需要使用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;
    }
公共列表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
块中删除即可