SqlCommand具有多个批处理的select,insert,update语句

时间:2012-09-25 13:43:21

标签: c# .net ado.net

我想使用一个SqlCommand在一个批处理中执行多个select,insert,update语句,以提高性能。
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;
    }

任何想法如何获得它?

1 个答案:

答案 0 :(得分:2)

您可以使用SQL语句添加第一行作为字符串:

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

然后在每个动作(INSERT / UPDATE)之后执行:

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

并添加为最后一个命令

"SELECT @rCount"