使用IDisposable时放置try/catch的位置

And*_*rew 5 c# idisposable try-catch

我只是被建议将整个using块放在一个内部try,否则using范围将阻止异常被捕获.但是,using如果抛出异常,是否会阻止正确处理其资源?如果我有下面的代码,我应该把try块放在哪里?

using (connSQL = new SqlConnection(strConn)) 
{
    connSQL.Open();
    using (SqlCommand commSQL = new SqlCommand(strPreparedStatement, connSQL)) 
    {
        if (sqlParameters != null)
        {
            for (int i = sqlParameters.GetLowerBound(0); i <= sqlParameters.GetUpperBound(0); i++)
            {
                commSQL.Parameters.Add(sqlParameters[i]);
            }
        }
        drSQL = commSQL.ExecuteReader();
        dtReturn.Load(drSQL);

        commSQL.Parameters.Clear();
    }
}
Run Code Online (Sandbox Code Playgroud)

在此应用程序中,确保与数据库的连接不会因异常而开始累积更为重要.

Jon*_*eet 9

using声明将已阻止连接积聚-它的东西清除侧对你来说,通过有效地作为一个try/ finally与呼叫块Disposefinally块.如果你想要一个try/ catchblock,你可以把它放在里面或外面 - 但你确定它不应该在更高的水平吗?您实际上期望如何处理异常?

顺便说一句,目前还不清楚为什么要在命令即将被处理时清除命令中的参数...

我鼓励你在using语句中声明变量,这样你最终不会试图在块之外读取它们:

using (SqlConnection connSQL = new SqlConnection(strConn)) {
Run Code Online (Sandbox Code Playgroud)

通常,您希望尽可能缩小范围.哦,你也SqlDataReader应该using发表声明.无论如何,当你关闭连接和命令时,它可能无关紧要,但我会把它作为一个原则点 - 它实现IDisposable,所以你应该处理它.

哦,你的迭代方式sqlParameters目前相当长.foreach使它更简单,即使我不使用它,for (int i = 0; i < sqlParameters.Length; i++)除非我有理由相信它不是一个"简单"的数组.

所以,我的等效代码看起来像这样:

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    using (SqlCommand command = new SqlCommand(strPreparedStatement, connection))
    {
        if (sqlParameters != null)
        {
            // If sqlParameter is an array, you can just use
            // command.Parameters.AddRange(sqlParameters) instead
            foreach (SqlParameter parameter in sqlParameters)
            {
                command.Parameters.Add(parameter);
            }
        }
        using (SqlDataReader reader = command.ExecuteReader())
        {
            DataTable table = new DataTable();
            // Perform any extra initialization here
            table.Load(reader);
            return table;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)