2016-07-07 40 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解決了它!但它仍然沒有使-ModificarFactura交易:( –

回答

1

你不能愚蠢地吞下所有的錯誤,並忽略它們。並且無法在catch塊中始終ROLLBACK,無需首先諮詢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