質問: 私は.NET 4でオンラインツールを開発して、ExcelページをDataTableに読み込み、SqlBulkCopy.WriteToServer()を使用して一致するSql Server 2000(すぐに2008になる)テーブルにアップロードします。それは私の会社内での使用のためだけであるので、私は外部使用のためにそれを確保することについてあまり心配する必要はありません。 私はそれを夢のように働かせてくれました。自然に前に実行していた行単位の挿入よりもずっと速いのです。しかし、今私はそれが正しいアプローチであるかどうか自分に尋ねています。 まず、ビジネス上の観点から、他のすべてのデータアクセスは、ユーザーにexecアクセス権を付与したストアドプロシージャを使用しますが、これにはテーブルレベルのセキュリティが必要です。 第二に、ほとんどのオンライン文書では、これは日々の使用ではなく、オフオペレーションのためのツールであると述べています。 私はSqlBulkCopyを使うことのネガティブなことについて多くの言及を見つけることができません。私が心配すべきセキュリティ上の問題やその他の問題はありますか?私が検討できる代替アプローチはありますか?すべてと同様に、私の主な目的は、セキュアで正しい方法で、可能な限り迅速に作業することです。 どうもありがとう。
回答: 私はあなたがこの選択肢でうまくいっていると言いたい。これは、通常のコマンド、バッチ処理以外の呼び出しを伴う標準のinsert文よりもパフォーマンス上の利点を得るために使用されています。これが、ストアドプロシージャの「標準」アプローチとは異なる理由です。 私は、セキュリティを単純に入力を検証する以上の懸念ではないと言っています。あなたがそれをやっているように見えるのは、テーブルに直接データを転送していて、サイドに沿ってカスタムSQLを実行していないということです。 これを複数回実行する場合は、複数の場所で大量のデータアクションを複数回行うための実動コードでこのコードを使用します。パフォーマンスのメリットは、使用するために使用するわずかに異なるDALコードを上回ります。 唯一の潜在的な問題はメモリ圧です。オブジェクトグラフから`DataTable`を作成すると、そのデータの2番目のコピーがメモリに格納されます(albiet、short lived)。いくつかの場所では、コードを`DataTable`を使用してオブジェクトグラフ(私はグラフ、通常はいくつかのフラットリスト)に対して`IDataReader`を実装するカスタムクラスを使用するように変更しました。これにより、メモリの負荷が軽減されます。