【问题标题】:SqlCommand with multiple batched select, insert, update statements具有多个批处理选择、插入、更新语句的 SqlCommand
【发布时间】:2012-09-25 13:43:20
【问题描述】:

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

有什么办法得到它吗?

【问题讨论】:

标签: c# .net ado.net


【解决方案1】:

您可以使用 SQL 语句将第一行添加到字符串中:

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

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

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

并作为最后一个命令添加

"SELECT @rCount"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2014-03-08
    • 2010-11-06
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多