3

我想使用一个 SqlCommand 在一批中执行多个选择、插入、更新语句,以提高性能。
CommandText 由多个预定义的插入、更新语句动态组合而成(SqlParam 也是动态组合的)。插入有时适用于具有 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;"

然后在每个操作(插入/更新)之后执行:

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

并添加为最后一个命令

"SELECT @rCount"
于 2013-08-30T19:26:31.063 回答