ADO.NET и утилизация без использования - PullRequest
0 голосов
/ 02 марта 2012

У меня есть проект, который нигде не использует USING со своим кодом ADO.NET.Я убираю их незакрытые соединения.Является ли приведенный ниже код лучшей практикой с try / catch / finally.У меня также есть некоторые, которые содержат SqlTransaction, который я располагаю между командой и удалением соединения.

SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["MyNGConnectDashBoardConnectionString"].ToString());
            SqlCommand cmd = new SqlCommand();
            DataSet ds = new DataSet();
            try
            {
                con.Open();
                cmd.Connection = con;

                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds);

            }
            catch (Exception ex)
            {
                throw ex;
            }

            finally
            {
                cmd.Dispose();
                con.Dispose();
            }

Ответы [ 3 ]

1 голос
/ 02 марта 2012

На самом деле, нет необходимости беспокоиться о закрытии соединения при использовании метода SqlDataAdapter.Fill(dataset).Этот метод закрывает соединение после выполнения каждого Fill.

Также нет необходимости вызывать SqlCommand.Dispose(), так как сама команда не имеет неуправляемых ресурсов для очистки.Вас должно беспокоить, если в какой-то момент вызывается SqlConnection.Close().Это делается после Fill.

0 голосов
/ 02 марта 2012

То, что у вас есть, хорошо.Всегда полезно избавляться от объектов, которые используют неуправляемые ресурсы.Однако, если вам надоело всегда явно вызывать Dispose, лучше всего использовать using:

using (SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["MyNGConnectDashBoardConnectionString"].ToString()))
{
    using (SqlCommand cmd = new SqlCommand())
    {
        DataSet ds = new DataSet();
        try
        {
            con.Open();
            cmd.Connection = con;

            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(ds);

        }
        catch (Exception ex)
        {
            throw; // I changed this too!
        }
    }
}

Кроме того, вы почти всегда хотите просто throw, если собираетесь«отбросить» исключение.Вы потеряете часть своей трассировки стека, если вы throw ex;.

0 голосов
/ 02 марта 2012

Лучшая практика - использовать using вместо try / finally:)

Однако в вашем случае даже использование не требуется, поскольку Fill() закрывает соединение:

        SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["MyNGConnectDashBoardConnectionString"].ToString())
        SqlDataAdapter da = new SqlDataAdapter("your sql is here", con);
        da.Fill(ds);

Также простые повторные исключения не имеют никакого смысла.Если вам нужно зарегистрировать ошибку, просто используйте обычный throw;, как предложено @Cory.

...