存储过程不执行事务

本文关键字:事务 执行 存储过程 | 更新日期: 2023-09-27 17:55:53

我从我的上下文中调用了这个存储过程,但它不起作用。然后我还有其他正在工作的存储过程...它没有发送任何错误。

它只是没有做出改变。

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

谢谢大家!

存储过程不执行事务

你不能随意

吞下所有错误并忽略它们。并且对于始终在捕获块中回滚无效,没有第一次咨询XACT_STATE()。下面是正确的存储过程错误处理模式:

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

试试这个

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