パフォーマンスを向上させるために、1 つの SqlCommand を使用して、複数の select、insert、update ステートメントを 1 つのバッチで実行したいと考えています。
CommandText は、複数の事前定義された挿入、更新ステートメントから動的にアセンブルされます (SqlParams も動的にアセンブルされます)。挿入は autoid フィールドを持つテーブルで機能する場合があるため、最後に挿入された ID を取得する必要があります。そのために「SELECT SCOPE_IDENTITY()」を使用します。通常、組み立てられた CommandText は次のようになります。
INSERT xxxxx ;
SELECT SCOPE_IDENTITY();
INSERT yyyyy ;
SELECT SCOPE_IDENTITY();
INSERT zzzzz ;
UPDATE xxxxx ;
INSERT wwwww ;
SELECT SCOPE_IDENTITY();
すべての scope_identity 値と、影響を受ける行の数を取得したいと考えています。ExecuteNonQuery と ExecuteScalar は単一の値しか返さないため、使用できません。ExecuteReaderの方が優れています。選択から情報を返しますが(上記の例では3つの結果が得られます)、影響を受ける行も必要です(実行をチェックするため)。
public IList Execute()
{
var results = new ArrayList();
using (var command = connection.CreateCommand())
{
command.Transaction = transaction;
var commandText = new StringBuilder();
.... building commandtext dynamically
command.CommandText = commandText.ToString();
command.Parameters.AddRange(... adding paramters dynamically);
var reader = command.ExecuteReader();
do
{
if (reader.Read())
results.Add(reader.IsDBNull(0) ? null : reader.GetValue(0));
} while (reader.NextResult());
reader.Close();
}
return results;
}
それを取得する方法はありますか?