存储过程c#

时间:2016-01-28 13:28:39

标签: c# sql-server stored-procedures transactions

我想使用相同的连接和相同的事务使用不同的参数执行相同的存储过程 理想情况下,如果对ExecuteNonQuery()的任何调用失败,则应回滚完整的事务。

存储过程:Sample1

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Sample1]
@start_date datetime, @end_date datetime, @empID int
WITH EXEC AS CALLER
AS
BEGIN
BEGIN TRANSACTION;
BEGIN TRY
   -- set of insert, delete and update
COMMIT TRANSACTION;
END TRY

BEGIN CATCH
Declare @ErrorMessage Varchar(100), @ErrorNumber Int 

   SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_MESSAGE() AS ErrorMessage;
   ROLLBACK TRANSACTION;
  RAISERROR(@ErrorMessage,@ErrorNumber,1);

END CATCH;

END

我的C#代码

public int ExecuteSP()
{ 
   var connectionString = ConfigurationManager.AppSettings["__WaveDatabaseConnection"];
          int rowsAffected = 0;
          using (var connection = new SqlConnection(connectionString))
          {
            connection.Open();
            var transaction = connection.BeginTransaction();
            try
            {

          var command = new SqlCommand(_StoreProcedureName, connection) { CommandType = CommandType.StoredProcedure };
          command.CommandType = CommandType.StoredProcedure;
          command.Connection = connection;
          command.Transaction = transaction;
          command.Parameters.Add("@empid", SqlDbType.Int).Value = site.ID;
          command.Parameters.Add("@start_date", SqlDbType.DateTime).Value = new DateTime();
          command.Parameters.Add("@end_date", SqlDbType.DateTime).Value = new DateTime();

          for (i = 0; i < 10; i++))
          {
            command.Parameters["@start_date"].Value = new DateTime().Add(i);
            command.Parameters["@end_date"].Value = new DateTime().Add(i+1);
            rowsAffected += command.ExecuteNonQuery();
          }
          transaction.Commit();
        }
        catch (SqlException sqlException)
        {
          var sqlExceptionMessage = string.Format("Error number : {0}, Error Type : {1} Error message : {2}",
            sqlException.ErrorCode, sqlException.GetType(), sqlException.Message);

          try
          {
            transaction.Rollback();
          }
          catch (Exception exception)
          {
            sqlExceptionMessage =
              string.Format("ExecuteError : {0}, RollBack exception Error Type : {1} Error message : {2}",
                sqlExceptionMessage, exception.GetType(), exception.Message);
          }
          throw new Exception(sqlExceptionMessage);
        }
      }
      return rowsAffected;
    }
}

现在我得到了这个例外

  

EXECUTE之后的事务计数表示BEGIN和COMMIT语句的数量不匹配。先前的计数= 1,当前计数= 0

当我从存储过程中删除所有BEGIN TRANS/COMMIT/ROLLBACK语句时,第一个command.ExecuteNonQuery()执行没有任何问题。
当它第二次调用它时会抛出这个异常:

  

批次结束时检测到不可提交的交易。该事务将被回滚。

我甚至尝试在SP中使用SET XACT_ABORT ON。但它没有帮助。

请帮助我了解如何在C#代码中提交全部或回滚以及如何解决上述问题。

由于 维杰

0 个答案:

没有答案