3

パフォーマンスを向上させるために、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;
    }

それを取得する方法はありますか?

4

1 に答える 1

2

SQL ステートメントを使用して、文字列の最初の行として追加できます。

"DECLARE @rCount int; SET @rCount = 0;"

次に、すべてのアクション (INSERT/UPDATE) の後に次のことを行います。

"SET @rCount = @rCount + @@ROWCOUNT"

最後のコマンドとして追加します

"SELECT @rCount"
于 2013-08-30T19:26:31.063 に答える