6

Excel ファイルからデータをアップロードするために .NET Web アプリケーションから DB とのインターフェイスを作成する方法に関するベスト プラクティスまたはアイデアを探しています。エラー発生時にロードを停止する仕組みを採用しています。

私はこれまでこの種の要件に対処する必要がなかったので、どんな助けも素晴らしいでしょう!

ありがとう

4

4 に答える 4

5

過去にうまくいった次のアプローチを試してみます。

  1. ユーザーがファイルをアップロードして、ディスク上のどこかに置くことを許可します。
  2. ファイルの結果を何らかのグリッドにバインドします (従来の接続/コマンド オブジェクトを使用して、ODBC/OLE DB を使用して Excel ファイルに接続できます)。
  3. ビジネス ルールのセットに基づいて、グリッド内の行に検証を適用します (通常、Excel データは非常に汚れています)。
  4. ユーザーがグリッド内の値を更新し、検証の問題を修正できるようにします。
  5. すべてのデータが適切であり、ユーザーが満足している場合は、トランザクションで一括挿入を実行します。
  6. 何か「悪い」ことが発生した場合は、ロールバックしてユーザー フィードバックを提示します。
于 2008-11-13T18:38:39.770 に答える
2

データをアップロードし、検証チェックに失敗した場合はフラグを立てる必要があります。実際にデータをロードするには、いくつかのオプションがあります。

  • ADO.Net 一括読み込み API - 一括読み込み API を使用してステージング テーブルに配置します。以下のスニペットは、.CSV ファイルを開き、プログラムでステージング テーブルに読み込むプロセスを示しています。

.

  public void Load() {
        bool OK = File.Exists(_filename);
        if (OK) {
            string sql = String.Format("Select * from {0}", FileName);
            OleDbConnection csv = new OleDbConnection();
            OleDbCommand cmd = new OleDbCommand(sql, csv);
            OleDbDataReader rs = null;
            SqlConnection db = null;
            SqlCommand clear = null;

            SqlBulkCopy bulk_load = null;
            try {
                    // Note two connections: one from the csv file
                    // and one to the database;
                    csv = new OleDbConnection();
                    csv.ConnectionString = ConnectionString;
                    csv.Open();
                    cmd = new OleDbCommand(sql, csv);
                    rs = cmd.ExecuteReader();

                    // Dung out the staging table
                    db = // [Create A DB conneciton Here]
                    clear = new SqlCommand("Truncate table Staging", db); // Left to the reader
                    clear.ExecuteNonQuery();

                   // Import into the staging table
                    bulk_load = new SqlBulkCopy(db);
                    bulk_load.DestinationTableName = Destination; // Actually an instance var
                    bulk_load.WriteToServer(rs);
                } catch (Exception ee) {
                    string summary = ee.Message;
                    string detail = ee.StackTrace;
                    //Notify(DisplayType.error, summary, detail);
                } finally {
                    if (rs != null) rs.Close();
                    if (csv != null) csv.Close();
                    if (bulk_load != null) bulk_load.Close();
                }
            }
        }
  • BCP または SSIS を使用して、スプレッドシートから直接、または .CSV ファイルからインポートします。
于 2008-11-13T18:17:27.550 に答える
1

DB のデータ整合性が重要な場合は、エラーのあるデータや DB の検証要件を満たさないデータのインポートを許可しないでください。

これらは Excel ファイルであるため、別のインターフェイスを使用してデータを修正しようとする代わりに、ユーザーが Excel ファイル内のデータを修正するのは十分に簡単なはずです。エラーメッセージが問題のあるフィールドにユーザーを誘導し、何が間違っているかを明確に説明していることを確認してください.

于 2008-11-13T18:15:25.497 に答える
0

DB に Excel ファイルをブロブとして配置しますか? または、ファイルを解析して、ファイル内のレコードをデータベースに入れますか?

私は後者であると推測しています。

ユーザーとして、エラーを修正して再試行できるように、エラーの内容を知るオプションが必要です。再試行の方法は、アップロードするデータの量によって異なると思います。

ハイブリッド ソリューションを試してみたいと思います。エラーが数個しかない場合は、それらのエラーを修正する画面を表示して、ユーザーがすぐに先に進むことができるようにします。大量のエラーがある場合は、それを実行して、ユーザーにもう一度やり直してもらう必要があります。

DBまで。アップロードがチェックされて「実際の」データが取得されるまで別のテーブルを作成するか、 UploadUniqueId 列を作成して、アップロードを大騒ぎせずにロールバックできるようにします。

UploadUniqueId = 'GUID' の tableName を削除します

于 2008-11-13T18:07:05.543 に答える