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

时间:2015-06-26 07:25:29

标签: 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);
        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>

1 个答案:

答案 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块中删除。