Как вы используете ADO.NET для создания источника данных, а не для чтения и манипулирования им? - PullRequest
1 голос
/ 27 августа 2009

Я пишу плагин для другой программы, которая генерирует довольно сложную древовидную структуру объектов. Пользователям нужно будет экспортировать эти данные из плагина для анализа и составления отчетов. Я определенно хочу, чтобы они могли экспортировать в базу данных MS Access, так как это было бы наиболее доступным для них для создания быстрых и чистых отчетов. Но я также хотел бы настроить все так, чтобы было легко экспортировать данные в другие источники данных (XLS, XML, SQL Server и т. Д.) Без большого количества дублирующегося кода.

Я создал рекурсивные методы, которые будут заполнять различные DataTables из древовидной структуры. Затем я могу вставить эти DataTables в DataSet . Но в этот момент я немного растерялся.

Все примеры, которые я нахожу для ADO.NET , начинаются с наличия некоторого центрального источника данных. Затем вы создаете DataConnection для данных через правильный DataProvider , используя строку подключения. После чего вы можете получить либо DataReader , либо DataSet в зависимости от того, нужно ли сохранить изменения обратно в источник.

Все же я начинаю с DataSet , и мне нужно создать источник данных из него. Есть ли какой-нибудь простой способ многократного использования, чтобы я мог создать новый DataConnection на основе какого-либо существующего пустого источника данных, а затем заполнить его моим DataSet ?

Например, я мог бы создать DataConnection для пустого файла MS Access. Тогда я мог бы использовать свои рекурсивные методы для заполнения различных DataTables в DataSet из моей древовидной структуры. Но как я мог заполнить пустую базу данных доступа с таким результатом DataSet ?

Я надеюсь на метод, который достаточно универсален, чтобы можно было легко экспортировать в разные потенциальные источники данных, просто меняя местами DataProviders и / или строки подключения.

1 Ответ

2 голосов
/ 27 августа 2009

По сути, вы задаете два отдельных вопроса: один о вставке данных без предварительного выбора из целевой таблицы, а другой о сохранении независимости вашей базы данных постоянного кода.

Относительно легко создать таблицу данных в памяти и сохранить ее с помощью DataAdapter и DbCommandBuilder . Адаптер данных используется для синхронизации таблицы данных с базой данных, а построитель команд используется адаптером данных для автоматического создания операторов вставки (и обновления) на основе предоставленной команды выбора.

До тех пор, пока вам не нужно выполнять какие-либо сложные запросы SQL, будет довольно легко поддерживать независимость базы данных кода с помощью DbProviderFactory . По сути, он скрывает от вас реализацию поставщика ADO.net, поэтому вы кодируете базовые интерфейсы общим способом.

Следующий пример должен иллюстрировать два вышеупомянутых понятия.

public static void Main()
{
    var providerName = "System.Data.OleDb";
    var connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
                            "Data Source=output.mdb";
    var table = new DataTable {
                        Columns = {
                            new DataColumn("ID", typeof (int)),
                            new DataColumn("Name", typeof (string)) },
                        Rows = {
                            new object[] {1, "One"},
                            new object[] {2, "Two"} }
                    };
    SaveData(providerName, connectionString, table);
}
private static void SaveData(string providerName,
                             string connectionString,
                             DataTable table)
{
    var factory = DbProviderFactories.GetFactory(providerName);
    var connection = factory.CreateConnection();
    connection.ConnectionString = connectionString;
    var command= factory.CreateCommand();
    command.Connection = connection;
    command.CommandText = "select ID, Name from Person";
    var adapter = factory.CreateDataAdapter();
    adapter.SelectCommand = command;
    var builder = factory.CreateCommandBuilder();
    builder.DataAdapter = adapter;
    adapter.Update(table);
}

Это решение касается только сохранения в базах данных. Для экспорта в Excel вы можете использовать провайдера Jet OleDb (подробнее здесь ), а для XML вы можете использовать XmlSerializer .

...