2012-09-25 99 views
2

我想在一個批處理中執行多個select,insert,update語句,使用一個SqlCommand來提高性能。
CommandText從多個預定義的插入,更新語句動態組合(SqlParams也是動態組合的)。插入有時在帶有自動字段的表上工作,因此找回最後插入的ID是必需的。我使用'SELECT SCOPE_IDENTITY()'。 一個典型的組裝的CommandText如下所示:SqlCommand具有多個批處理選擇,插入,更新語句

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; 
    } 

任何想法如何得到它?

+0

@@ ROWCOUNT是你的朋友。檢查這裏:http://stackoverflow.com/questions/1103260/return-number-of-rows-affected-by-update-statements –

回答

1

可以作爲第一行用SQL語句添加到字符串:

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

再經過每一個動作(INSERT/UPDATE)做:

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

,並添加一個非常最後的命令

"SELECT @rCount"