Лучшие практики ADO.NET для области объекта соединения и DataAdaptor

Чтобы это работало, вам нужно настроить функцию в общем виде, предоставляя все, что нужно компилятору для ее разрешения как A. Не совсем приятно повторять ограничения, но это работает.

static void TestFunction<T>(Class1<T> test) where T : A
{

}
7
задан Mark Lansdown 27 February 2009 в 09:08
поделиться

2 ответа

1) Вам не нужен тот же DataAdapter, но если Вы создаете новый, он должен использовать тот же запрос в качестве своей основы.

2) DataAdapter откроет свое соединение, если соединение будет закрыто. В этом случае это закроет соединение снова после того, как это будет сделано. Если соединение будет уже открыто, то оно оставит соединение открытым даже после того, как оно будет сделано.

Обычно Вы работали бы в Вашем примере. Создайте Conneciton и DataAdapter, заполните DataTable и избавьтесь от Соединения и DataAdapter впоследствии.

Два комментария к Вашему коду:

  • Вам не нужен CommandBuilder здесь, так как Вы только делаете выбор. Разработчик команды только необходим, если Вы хотите генерировать, Вставляют, Обновление или Операторы удаления автоматически. В этом случае также необходимо установить InsertCommand, UpdateCommand или DeleteCommand на DataAdapter вручную от CommandBuilder.
  • Второй. Вместо вызова Располагают вручную, необходимо использовать Использование пункта. Это гарантирует, что от Ваших объектов избавятся, даже если исключение будет выдано.

Попытайтесь изменить свой код на это:

DataTable dt = new DataTable();
using (OleDbConnection conn = new OleDbConnection("my_connection_string"))
using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * from Employees", conn))
{
  adapter.Fill(dt);    
}

Обратите внимание, что я определяю DataTable вне пунктов использования. Это необходимо, чтобы гарантировать, что таблица находится в объеме при отъезде использований. Также обратите внимание, что Вам не нужен Расположить запрос к DataAdapter или Опасному положению на Соединении. Оба сделаны неявно, когда Вы оставляете использования.

О. И добро пожаловать в ТАК :-)

3
ответ дан 7 December 2019 в 16:46
поделиться

Отвечать на Ваши вопросы:

  1. Идеально, необходимо сохранить тот же DataAdapter, потому что он уже работал, это - инициализация. DataAdapter обеспечивает свойства, такие как SelectCommand, UpdateCommand, InsertCommand и DeleteCommand, которые позволяют Вам устанавливать различные Объекты команды для выполнения их другая функция на источнике данных. Так, Вы видите, DataAdapter разработан, чтобы быть снова использованным для нескольких команд (для того же соединения с базой данных). Ваше использование CommandBuilder (хотя, не рекомендуемый) создает другие Команды, анализируя SelectCommand, таким образом позволяя Вам выполнить Обновления, Удаляет и Вставляет использование того же CommandBuilder.

  2. Лучше позволять DataAdapter неявно обрабатывать соединения с базой данных. @Rune, который Гримстад уже разработал на этом неявном поведении и полезно понять это. Идеально, соединения должны быть закрыты как можно скорее.

0
ответ дан 7 December 2019 в 16:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: