1

オブジェクトのかなり複雑なツリー構造を生成する別のプログラムのプラグインを作成しています。ユーザーは、分析とレポートのためにプラグインからこのデータをエクスポートする必要があります。迅速でクリーンなレポートを作成するには、MS Access データベースが最もアクセスしやすいため、MS Access データベースにエクスポートできるようにしてほしいと思います。しかし、多くの重複コードなしで他のデータ ソース (XLS、XML、SQL Server など) に簡単にエクスポートできるように設定したいとも考えています。

ツリー構造からさまざまなDataTableを設定する再帰メソッドを作成しました。次に、これらのDataTablesDataSetに詰め込むことができます。しかし、その時点で私はちょっと迷っています。

私が見つけたADO.NETの例はすべて、中心的なデータ ソースを持つことから始まります。次に、接続文字列を使用して、正しいDataProviderを介してデータへのDataConnectionを作成します。その後、変更をソースに戻す必要があるかどうかに応じて、 DataReaderまたはDataSetのいずれかを取得できます。

それでも、私はDataSetから始めており、そこからデータ ソースを作成する必要があります。既存の空のデータ ソースに基づいて新しいDataConnectionを作成し、それを自分のDataSetに設定する簡単な再利用可能な方法はありますか?

たとえば、空の MS Access ファイルへのDataConnectionを作成できます。次に、再帰メソッドを使用して、ツリー構造からDataSetにさまざまなDataTableを設定できます。しかし、この結果のDataSetを空のアクセス データベースに入力するにはどうすればよいでしょうか。

さまざまなDataProvidersや接続文字列を交換するだけで、さまざまな潜在的なデータ ソースに簡単にエクスポートできるように、十分に汎用的なメソッドを望んでいます。

4

1 に答える 1

2

ここでは基本的に 2 つの個別の質問をしています。1 つは最初にターゲット テーブルから選択せずにデータを挿入することに関するもので、もう 1 つは永続化コード データベースにとらわれないようにすることに関するものです。

DataAdapterDbCommandBuilderを使用して、手動でメモリ内にデータ テーブルを構築し、それを永続化するのは比較的簡単です。データ アダプターはデータ テーブルをデータベースに同期するために使用され、コマンド ビルダーはデータ アダプターによって使用され、提供された選択コマンドに基づいて挿入 (および更新) ステートメントを自動的に生成します。

複雑な SQL クエリを実行する必要がない限り、DbProviderFactoryを使用してコード データベースにとらわれないようにすることはかなり簡単です。基本的に、ADO.net プロバイダーの実装を隠して、基になるインターフェイスに対して一般的な方法でコーディングできるようにします。

次の例は、上記の 2 つの概念を示しています。

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を使用できます。

于 2009-08-27T12:18:30.710 に答える