編集:解決策 (種類)
だから、私がしたことは、私が最初にやりたかったこととほとんど共通点がありませんでしたが、アプリケーションははるかに高速に動作するようになりました (処理に 15 分以上かかった DataSet は、30 ~ 40 秒で処理されます)トップス)。
- スプレッドシートを読み込んでDataTable
/DataSet
通常どおり入力
- [HACK WARNING] UpdateDataSet を使用する代わりに、主に更新の各タイプのスケルトン文字列 (例) を使用して、独自の SQL クエリを生成しますString skeleton = "UPDATE ... SET ... WHERE ..."
。...
次に、テンプレート データベースを調べて、プレースホルダーを適切なエントリに置き換えます。
- [MORE HACK WARNING] エラーに対処する方法は、それらのエラーが発生するかどうかを手動でチェックすることでした。したがって、挿入しようとしていることがわかっている場合は、実際の挿入の前にエラー チェック コマンドを実行します。エラー チェッカーが行うことは、JOIN ステートメントを構築し、ユーザーの DataSet 内のエントリがデータベースに既に存在するかどうかをチェックすることです。JOIN コマンドを実行するだけで、結果を含む DataSet が返されるので、そこに何かがある場合、それはエラーであることがわかります。その後、印刷に進みます。
詳細が必要な場合は、喜んで提供します。これはかなり具体的な質問なので、この概要はかなり高いレベルに保つ必要があります。
元の質問
私の制御の及ばない (正当な) 理由により、Database.UpdateDataSet()
Microsoft の Enterprise Library のメソッドを使用する必要があります。私のプロジェクトでは、Web アプリケーションに Excel スプレッドシートをアップロードすることで、ユーザーがデータベース (複数のデータベース、複数のスキーマ、複数のテーブル、ただし常に 1 つずつ) を変更できるようにしています。スプレッドシートは、私が指定したデザイン/テンプレートに従います (通常)。私は、スプレッドシートを読み取り、それを DataTable/DataSet に変換し、(動的に生成された) 準備済みステートメントを使用してデータベースに適切な変更を加える状態です。問題は次のとおりです。
各スプレッドシートでは、1 種類の変更 (挿入/更新/削除) のみが許可されます。ユーザーが挿入スプレッドシートをアップロードしたが、いくつか (10 としましょう) のエントリが既にデータベースにある場合、エラーを返すだけでなく、どのエントリ ( DataRow
s) がプライマリに違反したかを伝えます。キー制約。
アイデアの解決策は、エラーのリストが返された DataSet を取得することですが、それを行う方法がわかりません。おそらく、DataRow が挿入される場合 (上記の例に従って)、正常に処理されるような方法で準備済みステートメントを作成する方法があります。ただし、更新または削除しようとすると、それをスキップして何らかのエラー コレクションに追加しますか?
ストアド プロシージャの使用を避けようとしていることに注意してください。展開後、さまざまなテンプレートの数が非常に急速に増加するため、手動で記述されたコードを避け、データベース駆動型のモデルにできるだけ近づけることが重要です。