Чтобы это работало, вам нужно настроить функцию в общем виде, предоставляя все, что нужно компилятору для ее разрешения как A
. Не совсем приятно повторять ограничения, но это работает.
static void TestFunction<T>(Class1<T> test) where T : A
{
}
1) Вам не нужен тот же DataAdapter, но если Вы создаете новый, он должен использовать тот же запрос в качестве своей основы.
2) DataAdapter откроет свое соединение, если соединение будет закрыто. В этом случае это закроет соединение снова после того, как это будет сделано. Если соединение будет уже открыто, то оно оставит соединение открытым даже после того, как оно будет сделано.
Обычно Вы работали бы в Вашем примере. Создайте Conneciton и DataAdapter, заполните DataTable и избавьтесь от Соединения и DataAdapter впоследствии.
Два комментария к Вашему коду:
Попытайтесь изменить свой код на это:
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 или Опасному положению на Соединении. Оба сделаны неявно, когда Вы оставляете использования.
О. И добро пожаловать в ТАК :-)
Отвечать на Ваши вопросы:
Идеально, необходимо сохранить тот же DataAdapter, потому что он уже работал, это - инициализация. DataAdapter обеспечивает свойства, такие как SelectCommand, UpdateCommand, InsertCommand и DeleteCommand, которые позволяют Вам устанавливать различные Объекты команды для выполнения их другая функция на источнике данных. Так, Вы видите, DataAdapter разработан, чтобы быть снова использованным для нескольких команд (для того же соединения с базой данных). Ваше использование CommandBuilder (хотя, не рекомендуемый) создает другие Команды, анализируя SelectCommand, таким образом позволяя Вам выполнить Обновления, Удаляет и Вставляет использование того же CommandBuilder.
Лучше позволять DataAdapter неявно обрабатывать соединения с базой данных. @Rune, который Гримстад уже разработал на этом неявном поведении и полезно понять это. Идеально, соединения должны быть закрыты как можно скорее.