none
Procedure com Begin Tran e C# RRS feed

  • Pergunta

  • Boa Noite!

    Estou desenvolvendo um programa que vai Executar um Procedure  onde vai executar alguns Updates e caso não haja nenhum problema emita uma mensagem de sucesso caso contrario avise do erro e não execute nenhum do updates.

    Porém não sei muito bem como fazer, tentei fazer da seguinte forma no SQL Server.

    Create Procedure Movimenta
    @cad4 int,
    @cad2 int
    
    as
    
    begin try
     begin tran
    
    UPDATES
    
    end try
    begin catch
    
    	SELECT ERROR_MESSAGE() AS ErrorNumber;
    	rollback	
    	   
    END CATCH;

    Mas não sei se este é o modo correto, mas se for como ficaria no C#, e se não for o jeito correto, alguém poderia me ajudar?

    Desde já Obrigado.

    quinta-feira, 20 de dezembro de 2012 22:39

Respostas

  • Olá Marcos,

    O comando que retorna as linhas afetadas é o @@ROWCOUNT

    Abaixo aproveitei o código do post blog e adicionei uma chamada a esse comando.

    -- ABRE UMA TRANSAÇÃO
    BEGIN TRANSACTION;
    
    BEGIN TRY
    
        -- COMANDOS SQL
        INSERT INTO tbBLABLABLA... 
    
        -- RETORNA A QUANTIDADE DE LINHAS AFETADAS
        SELECT @@ROWCOUNT AS LINHAS_AFETADAS
    
    END TRY
    BEGIN CATCH
    
        -- SELECIONA DADOS DO ERRO
        SELECT 
            ERROR_NUMBER() AS ErrorNumber
            ,ERROR_SEVERITY() AS ErrorSeverity
            ,ERROR_STATE() AS ErrorState
            ,ERROR_PROCEDURE() AS ErrorProcedure
            ,ERROR_LINE() AS ErrorLine
            ,ERROR_MESSAGE() AS ErrorMessage;
    
        -- SE EXISTIR UMA TRANSAÇÃO ENTÃO SERÁ FEITO O ROLLBACK
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION;
    END CATCH;
    
    -- SE EXISTIR UM BLOCO DE TRANSAÇÃO ENTÃO É FEITO O COMMIT
    IF @@TRANCOUNT > 0    
        COMMIT TRANSACTION;

    Caso o comando dê algum erro, você pode observar que a procedure fara um SELECT retornando os valores de ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(),ERROR_LINE(), ERROR_MESSAGE().

    Assim vc conseguirá diferenciar as duas situações.

    []s!


    MSc. Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    quarta-feira, 26 de dezembro de 2012 21:59
    Moderador

Todas as Respostas

  • Olá Marcos,

    Fiz um post no meu blog com base na sua pergunta.

    Veja se isso ajuda: http://ferhenriquef.com/2012/12/22/transaes/

    []s!


    MSc. Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    sábado, 22 de dezembro de 2012 18:13
    Moderador
  • Boa tarde Fernando,

    usando o exemplo que você deu no blog.

    1 – Dentro de uma Procedure de banco de dados:

    Como eu faria no C# para mostrar o numero de linhas afetadas? e caso de Rollback informar que o processo não foi feito.

    Desde já Obrigado.

    quarta-feira, 26 de dezembro de 2012 19:22
  • Olá Marcos,

    O comando que retorna as linhas afetadas é o @@ROWCOUNT

    Abaixo aproveitei o código do post blog e adicionei uma chamada a esse comando.

    -- ABRE UMA TRANSAÇÃO
    BEGIN TRANSACTION;
    
    BEGIN TRY
    
        -- COMANDOS SQL
        INSERT INTO tbBLABLABLA... 
    
        -- RETORNA A QUANTIDADE DE LINHAS AFETADAS
        SELECT @@ROWCOUNT AS LINHAS_AFETADAS
    
    END TRY
    BEGIN CATCH
    
        -- SELECIONA DADOS DO ERRO
        SELECT 
            ERROR_NUMBER() AS ErrorNumber
            ,ERROR_SEVERITY() AS ErrorSeverity
            ,ERROR_STATE() AS ErrorState
            ,ERROR_PROCEDURE() AS ErrorProcedure
            ,ERROR_LINE() AS ErrorLine
            ,ERROR_MESSAGE() AS ErrorMessage;
    
        -- SE EXISTIR UMA TRANSAÇÃO ENTÃO SERÁ FEITO O ROLLBACK
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION;
    END CATCH;
    
    -- SE EXISTIR UM BLOCO DE TRANSAÇÃO ENTÃO É FEITO O COMMIT
    IF @@TRANCOUNT > 0    
        COMMIT TRANSACTION;

    Caso o comando dê algum erro, você pode observar que a procedure fara um SELECT retornando os valores de ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(),ERROR_LINE(), ERROR_MESSAGE().

    Assim vc conseguirá diferenciar as duas situações.

    []s!


    MSc. Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    quarta-feira, 26 de dezembro de 2012 21:59
    Moderador
  • Obrigado Fernando Tentarei realizar aqui.
    quinta-feira, 27 de dezembro de 2012 21:03
  • Fernando, deu certo o Código que você me indicou, mas você poderia me ajudar com mais uma dúvida?

    Como coloco o valor do de um select que retorna uma linha só

    SELECT @@ROWCOUNT AS LINHAS_AFETADAS

    em uma variável para exibir em uma mensagem?

    Eu trabalhei apenas com DataGrid onde eu usava a Propriedade DataSource para Carrega - lo.


    sexta-feira, 28 de dezembro de 2012 13:18
  • Olá Marcos,

    Veja se isso ajuda:

    DECLARE @QUANTIDADE INT
    SELECT @QUANTIDADE = @@ROWCOUNT

    []s!

    MSc. Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    sexta-feira, 28 de dezembro de 2012 13:25
    Moderador
  • Fernando eu consegui desta Forma.

    mensagem = reader[0].ToString();

    Obrigado.

    sexta-feira, 28 de dezembro de 2012 15:21