いくつかの列を含むレコードのリストを保存する必要があります。それには2つの方法があります。
その要素のリストを作成し、コード内からストアド プロシージャを複数回実行するだけです。
foreach(TestInfo test in lstTestInfo) {//ストアド プロシージャを実行}
文字列を作成してデータベースに送信し、そこで分割して一時テーブルに保存し、そこに 1 回の往復で挿入できます。
これは深刻な問題ではありませんが...いくつかの洞察が必要です。ありがとう!
いくつかの列を含むレコードのリストを保存する必要があります。それには2つの方法があります。
その要素のリストを作成し、コード内からストアド プロシージャを複数回実行するだけです。
foreach(TestInfo test in lstTestInfo) {//ストアド プロシージャを実行}
文字列を作成してデータベースに送信し、そこで分割して一時テーブルに保存し、そこに 1 回の往復で挿入できます。
これは深刻な問題ではありませんが...いくつかの洞察が必要です。ありがとう!
複雑にしないでおく。堅牢な方法で最も簡単に実装できるソリューションから始めてください。これが最初のソリューションだと思います。
次に、パフォーマンスが十分に優れているかどうかをテストし、問題がある場合は実装を再検討できます。
単一の接続とコマンドを使用してデータを効率的に渡すことを簡単にします。他の複雑な手法を使用することはできますが、多くのメリットが得られず、sprocが混乱することはないと思います。
public void UpdateUserItems(Guid userId, string[] items)
{
using (SqlConnection conn = new SqlConnection("connectionstring..."))
{
using (SqlCommand cmd = new SqlCommand("Insert Into UserItems(UserId, Items) values (@UserId, @Items)"))
{
conn.Open();
cmd.Parameters.AddWithValue("@UserId", userId);
foreach(string item in items)
{
cmd.Parameters.AddWithValue("@Item", Item;
cmd.ExecuteNonQuery();
}
}
}
}
2番目のオプションを実装しようとすると、文字列自体の長さが妨げになる可能性があります。送信するデータはそれほど多くありません。データが多ければ多いほど、ソリューションは効果的ではありません。
DBに対して複数の呼び出し(ソリューション1)を行うことは、オーバーヘッドでもあります。複数のセルが他のセルの更新に依存していると仮定して、トランザクションを台無しにすることもできます。
自分で決める、それはあなたがする必要のあるトレードオフです。
それを見るには2つの方法があります。1.簡単なことと2.正しいことをしますか?最初のオプションは簡単ですが、長期的な解決策を提供するものではありません。遅かれ早かれ、あなたはそれが正しいパフォーマンスを生み出しておらず、これを行うための最も簡単な方法であることに気付くでしょう。これは、ユーザーが少なく、すべてが1台のマシンにセットアップされている場合にうまく機能する可能性があります。
ただし、2番目のアプローチは、電信送金を減らすだけでなく、データベースへの呼び出しを最小限に抑えます。接続が含まれることを意味するSPの実行について話しているのですが、DBへのすべての呼び出しはオーバーヘッドであり、それを最小限に抑えるように努める必要があります。n層展開の負荷分散環境を使用している場合、オプション#1を選択すると、別のサーバーでDBを呼び出すことができなくなります。
オプション2を選択します。実装にはもう少し時間がかかりますが、後で労力を節約できます。
これはよくある質問であり、多くの回答が考えられます。たとえば、[複数のオプションのパラメーターを検討しましたか? Joe Celko によるこの記事では、このオプションについて説明し、Erland Sommarskog によるこのテーマに関する「古典的な」記事へのリンクも提供しています。