Ответ 1
Вы также должны сделать это:
using (SqlDataReader reader =
cmd.ExecuteReader
(CommandBehavior.CloseConnection))
{
table.Load(reader);
}
при загрузке таблицы
до сих пор я всегда использовал аналогичную структуру для получения данных из БД и заполнения 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) ', object' table 'не располагается по всем путям исключений. Вызовите System.IDisposable.Dispose на "table" объекта, прежде чем все ссылки на него будут недоступны.
TestService.cs(42): CA2000: Microsoft.Reliability: В методе '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 внутри использования?
Спасибо
Приветствия
Вы также должны сделать это:
using (SqlDataReader reader =
cmd.ExecuteReader
(CommandBehavior.CloseConnection))
{
table.Load(reader);
}
при загрузке таблицы
Чтобы "исправить" вашу проблему с помощью DataTable, возможно, вы могли бы изменить свою функцию.
public static void GetByID(DataTable table, int testID)
{
// bla bla bla
}
// calling the function
using(DataTable table = new DataTable())
{
TestService.GetByID(table, 5);
}
Не сказать, что это оптимальное решение, но оно решит жалобу.