10

私は、c#を使用してasp.net visual studio 2008 / SQL 2000(将来的には2005)でプロジェクトを開始しています。

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

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

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

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

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

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

4

5 に答える 5

8

優れた FileHelpers ライブラリをチェックしてください。それに関する CodeProject の記事があり、ここでホストされています。

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

私はさまざまなプロジェクトでそれをうまく使用してきましたが、問題なく動作します-強くお勧めします.

于 2009-01-29T06:08:43.073 に答える
5

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

データベース エンジンとして SQL Server を使用していますか? その場合、SqlBulkCopy クラス ( http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx ) を使用して、IDataReader を効率的に取得し、必要に応じて列をマップし、データベースに結果が表示されます。

于 2009-01-29T01:57:13.113 に答える
3

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

それまでの間、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;
    }
}
于 2009-01-29T02:11:49.917 に答える
1

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

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

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

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

于 2010-10-05T19:39:20.117 に答える
1

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

于 2009-01-29T06:51:22.160 に答える