2016-07-07 3 views
0

У меня есть эта хранимая процедура, вызванная из моего контекста, и она не работает. Затем у меня есть другие хранимые процедуры, которые работают ... он не отправляет никаких ошибок.Сохраненная процедура не совершает транзакции

Это просто не внесение изменений.

var id = facturavm.Id; 

if (facturavm.EstadoAnterior == 0) 
{ 
    var fecha = new DateTime(Convert.ToInt32(facturavm.Fecha[6].ToString() + facturavm.Fecha[7].ToString() + facturavm.Fecha[8].ToString() + facturavm.Fecha[9].ToString()), Convert.ToInt32(facturavm.Fecha[3].ToString() + facturavm.Fecha[4].ToString()), Convert.ToInt32(facturavm.Fecha[0].ToString() + facturavm.Fecha[1].ToString())); 
    var x = DBManager.Context.ModificarFactura(facturavm.IdCliente, facturavm.IdProveedor, fecha, facturavm.MonedaDescripcion, facturavm.MonedaCambio, facturavm.Estado, facturavm.Total, id); 
    DBManager.Context.SubmitChanges(); 
    DBManager.Context.ModificarFactura_Eliminar(id); 
    DBManager.Context.SubmitChanges(); 
... 

И мои хранимые процедуры:

(1) Один не работает:

CREATE PROCEDURE [dbo].[ModificarFactura] 
    @idCleinte int, 
    @idProveedor int, 
    @fecha date, 
    @monedaDescripcion varchar(50), 
    @monedaCambio float, 
    @estado int, 
    @total float, 
    @id int 
AS 
    BEGIN TRY 
    BEGIN TRAN 
     UPDATE Factura 
     SET IdCliente = @idCleinte, 
      IdProveedor = @idProveedor, 
      Fecha = @fecha, 
      MonedaDescripcion = @monedaDescripcion, 
      MonedaCambio = @monedaCambio, 
      Estado = @estado, 
      Total = @total 
     WHERE Id = @id 

     COMMIT TRAN 
    END TRY 
    BEGIN CATCH 
     ROLLBACK TRAN 
    END CATCH 
    RETURN 0 

(2) И тот, который работает:

CREATE PROCEDURE [dbo].[ModificarFactura_Eliminar] 
    @idFactura int 
AS 
    BEGIN TRY 
    BEGIN TRAN 
     DELETE FROM DetalleFactura 
     WHERE IdFactura = @idFactura; 

     DELETE FROM ImpuestoProyectoFactura 
     WHERE IdFactura = @idFactura; 

     DELETE FROM ProyectoFactura 
     WHERE IdFactura = @idFactura; 

     DELETE FROM Impuesto 
     WHERE IdFactura = @idFactura; 

     COMMIT TRAN 
END TRY 
BEGIN CATCH 
     ROLLBACK TRAN 
END CATCH 

RETURN 0 

Спасибо всем!

+0

запустить его без попытки поймать, вы можете быть в состоянии исправить это –

+1

@ARUN теперь я получаю мое исключение !! спасибо –

+1

@ ARUN разрешил это! Но он все еще не совершает транзакцию -ModificarFactur- :( –

ответ

1

Вы не можете nilly-willy проглатывать все ошибки и игнорировать их. И недействительно всегда ROLLBACK в блоках catch, без первой консультации XACT_STATE(). Here правильный хранимая процедура шаблон обработки ошибок:

create procedure [usp_my_procedure_name] 
as 
begin 
    set nocount on; 
    declare @trancount int; 
    set @trancount = @@trancount; 
    begin try 
     if @trancount = 0 
      begin transaction 
     else 
      save transaction usp_my_procedure_name; 

     -- Do the actual work here 

lbexit: 
     if @trancount = 0 
      commit; 
    end try 
    begin catch 
     declare @error int, @message varchar(4000), @xstate int; 
     select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE(); 
     if @xstate = -1 
      rollback; 
     if @xstate = 1 and @trancount = 0 
      rollback 
     if @xstate = 1 and @trancount > 0 
      rollback transaction usp_my_procedure_name; 

     raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ; 
    end catch 
end 
0

Попробуйте это

CREATE PROCEDURE [dbo].[ModificarFactura] 
    @idCleinte int, 
    @idProveedor int, 
    @fecha date, 
    @monedaDescripcion varchar(50), 
    @monedaCambio float, 
    @estado int, 
    @total float, 
    @id int, 
    @sts int output, --RETURN STATUS COMMIT OR NOT FROM SQL 
    @error nvarchar(400) output --RETURN ERROR MESSAGE SQL 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SET @sts = 1 ; 
    SET @error = ''; 
    BEGIN TRY 
     BEGIN TRANSACTION 
      UPDATE Factura 
      SET IdCliente = @idCleinte, 
       IdProveedor = @idProveedor, 
       Fecha = @fecha, 
       MonedaDescripcion = @monedaDescripcion, 
       MonedaCambio = @monedaCambio, 
       Estado = @estado, 
       Total = @total 
      WHERE Id = @id 
     COMMIT TRANSACTION 
    END TRY 
    BEGIN CATCH 
     IF @@ERROR > 0 
      BEGIN 
       SET @sts = 0 ; 
       SET @error = ERROR_MESSAGE(); 
       ROLLBACK TRANSACTION 
      END 
    END CATCH 
END 
GO