web-dev-qa-db-ja.com

csvファイル/ ExcelをSQLデータベースasp.netにインポートします

私はc#を使用してasp.netビジュアルスタジオ2008/SQL 2000(将来的には2005)でプロジェクトを開始しています。

私にとって注意が必要なのは、既存のDBスキーマが頻繁に変更され、インポートファイルの列が列名で1対1で一致しない可能性があるため、すべて既存のdbスキーマと一致させる必要があることです。 (テーブルスキーマに使用する列名を提供するルックアップテーブルがあります)

私はこれに取り組むためのさまざまな方法を模索しており、専門家のアドバイスが必要です。これを行うために活用できる既存のコントロールまたはフレームワークはありますか?

これまで、FileUpload .NETコントロールと、アップロードを実行するためのサードパーティのアップロードコントロール( SlickUpload など)について説明しましたが、アップロードされるファイルは500MB未満である必要があります。

次の部分は、私のcsv/Excelを読み取り、ユーザーに表示するために解析して、dbスキーマと一致させることです。 CSVReader などを見ましたが、Excelの場合は、さまざまなバージョンをサポートする必要があるため、より困難です。

基本的に、このインポートを実行するユーザーは、このインポートファイルからいくつかのテーブルを挿入または更新します。レコードの照合やインポートレコードのプレビューなど、他にも高度な要件がありますが、最初にこれを行う方法を理解したいと思います。

更新:csvファイルをアップロードするためにLumenWorks.FrameworkでcsvReaderを使用することになりました。

10
kiev

LumenWorks.FrameworkのcsvReaderを使用して、インポートされた列に基づいて作成したSQLテーブルとメモリ内のDataTableにcsvファイルをアップロードおよびインポートしています。

また、ユーザーにUIのフィールドをマップさせ、各レコードに挿入/更新/エラーのラベルを付けて、インポートするデータの検証と準備に進みます。次に、影響を受けるテーブルごとに強く型付けされたDataSetを作成/入力し、Enterprise Library UpdateDataset()メソッドの挿入/更新クエリを作成します。

次に、トランザクションを送信してデータベースを挿入/更新します。 –

マッピングは4列のグリッドです。 (インポートフィールド名、宛先テーブル、宛先フィールド名、無視、一致ステータス)、宛先テーブルとフィールド名は、選択されたテーブルに基づいて更新するものを選択します。選択項目に動的にデータを入力します。一致するものが見つかった場合、最初に選択コンボに1つの値が入力されます。一致しない場合は、選択してください。無視すると、ユーザーはフィールドを無視できます。一致ステータスは、フィールドが自動マップされた場合です

1
kiev

優れたFileHelpersライブラリをチェックしてください-そこに CodeProjectに関する記事 それについて、そしてそれはホストされています ここ

これは純粋なC#であり、ほぼすべてのフラットファイル、CSVをインポートでき、Excelも処理します。インポートは完全に構成可能です-区切り文字、スキップする行や列などを定義できます-多くのオプション。

私はさまざまなプロジェクトでそれをうまく使用しました、そしてそれは完璧に動作します-強くお勧めします。

8
marc_s

ExcelまたはCSVファイルを介してIDataReaderを簡単に作成できます( http://support.Microsoft.com/kb/316934 を参照)。

データベースエンジンとしてSQLServerを使用していますか?その場合は、SqlBulkCopyクラス( http://msdn.Microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx )を使用して、IDataReader、マップを効率的に取得できます。必要に応じて列を作成し、結果をデータベースに保存します。

5
Antony Perkov

この潜在的に非常に複雑なアプリケーションを支援するための堅牢で柔軟なツールがいくつか存在する可能性があると思います。

それまでの間、ExcelファイルをDataTableに変換するのに役立つことがわかった関数を次に示します。このバージョンでは、最初のワークシートのみが検索されます。それは出発点として役立つかもしれません。 csvファイルと同様のものにするには、接続文字列を変更するだけで済みます。

public static DataTable GetDataTableFromExcel(string SourceFilePath)
{
    string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                                "Data Source=" + SourceFilePath + ";" +
                                "Extended Properties=Excel 8.0;";

    using (OleDbConnection cn = new OleDbConnection(ConnectionString))
    {
        cn.Open();

        DataTable dbSchema = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
        if (dbSchema == null || dbSchema.Rows.Count < 1)
        {
            throw new Exception("Error: Could not determine the name of the first worksheet.");
        }

        string WorkSheetName = dbSchema.Rows[0]["TABLE_NAME"].ToString();

        OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [" + WorkSheetName + "]", cn);
        DataTable dt = new DataTable(WorkSheetName);

        da.Fill(dt);

        return dt;
    }
}
3
HectorMac

FileHelpers はあなたの友達です。私はそれをいくつかのプロジェクトに喜んで使用しました、そしてそれは私に多くの悲しみと労力を節約しました

1
Rad