Распоряжение командой SQL и закрытие соединения - PullRequest
11 голосов
/ 12 декабря 2011

до сих пор я всегда использовал аналогичную структуру для получения данных из БД и заполнения DataTable

public static DataTable GetByID(int testID)
        {
        DataTable table = new DataTable();
        string query = @"SELECT * FROM tbl_Test AS T WHERE T.testID = @testID";

        using (SqlConnection cn = new SqlConnection(Configuration.DefaultConnectionString))
        {
            SqlCommand cmd = new SqlCommand(query, cn);
            cmd.Parameters.Add("@testID", SqlDbType.Int).Value = testID;

            cn.Open();
            table.Load(cmd.ExecuteReader());
        }

        return table;
    }

Теперь я видел некоторые предупреждения в анализе сборки:

TestService.cs (37): CA2000: Microsoft.Reliability: в методе «TestService.GetByID (int)» объект «таблица» расположен не по всем путям исключений.Вызовите System.IDisposable.Dispose для объекта 'table' до того, как все ссылки на него выйдут из области видимости.

TestService.cs (42): CA2000: Microsoft.Reliability: In метод 'TestService.GetByID (int)'вызовите System.IDisposable.Dispose для объекта 'cmd' до того, как все ссылки на него выйдут из области видимости.

Должен ли я изменить свой код в

    public static DataTable GetByID(int testID)
    {
        DataTable table = new DataTable();
        string query = @"SELECT * FROM tbl_Test AS T WHERE T.testID = @testID";

        using (SqlConnection cn = new SqlConnection(Configuration.DefaultConnectionString))
        {
            using (SqlCommand cmd = new SqlCommand(query, cn))
            {
                cmd.Parameters.Add("@testID", SqlDbType.Int).Value = testID;

                cn.Open();
                table.Load(cmd.ExecuteReader());
            }
        }

        return table;
    }

Что делать с объектом DataTable?Это хорошая практика для размещения SqlCommand внутри использования?

Спасибо

Приветствия

Ответы [ 3 ]

7 голосов
/ 12 декабря 2011

Вы также должны сделать это:

using (SqlDataReader reader =
            cmd.ExecuteReader
                (CommandBehavior.CloseConnection))
        {
            table.Load(reader);
        }

при загрузке таблицы

3 голосов
/ 12 декабря 2011
  • Вызывающая сторона этого метода должна вызвать удаление DataTable, возвращенного, когда это сделано, используя его.
  • Да, хорошей практикой является размещение SqlCommand внутри, используя.
1 голос
/ 12 декабря 2011

Чтобы "исправить" вашу проблему с помощью DataTable, возможно, вы могли бы изменить свою функцию.

public static void GetByID(DataTable table, int testID)
{
    // bla bla bla
}


// calling the function
using(DataTable table = new DataTable())
{
    TestService.GetByID(table, 5);
}

Не говорите, что это оптимальное решение, но оно решит жалобу.

...