none
Múltiplos inserts e updates SQL Server RRS feed

  • Pergunta

  • Boa tarde pessoal,

    pesquisei bastante mas não encontrei nada que sanasse minha dúvida...

    Usando o C# e SQL EXPRESS, tenho uma tabela em que antes de inserir os dados nela, tenho que inserir em diversas outras, sei que devo estar fazendo errado, mas como está funcionando, estou mantendo da forma como está, mas isso tem me incomodado, o caso é que em uma tabela PRODUTO, antes de fazer o insert ou update nela eu preciso fazer diversos outros em outras tabelas como por exemplo na tabela MARCA, MODELO, entre outras. Eu gostaria de saber se existe uma forma de dar todos esses comandos mas dar o OK para realmente gravar se todos forem bem sucedidos. Se algum dos comandos der erro, ele não grava em nenhuma das tabelas. Da forma que estou fazendo, se der um erro no quinto comando, ele para de gravar nas próximas tabelas, mas as anteriores já estão todas gravadas, ou eu terei que encontrar essa possibilidade de dar o ok para gravar somente depois de ter conferido todos os comandos ou então terei que criar uma rotina de DESFAZER, para "desgravar" as tabelas já gravadas caso haja algum erro.

    Eu até já havia feito deu uma forma meio "gambiarra", onde eu não aplicava cada comando diretamente no SGBD, ao invés disso eu pegava cada comando e salvava em uma list<string> e ao final fazia um loop executando cada um deles. Até que deu certo, mas tive problemas por não ter conseguido usar parâmetros, aí ficou vulnerável e eu desisti.

    Alguém tem alguma ideia de qual seria a melhor forma pra resolver isto?

    Obrigado.

    sábado, 7 de novembro de 2015 14:47

Respostas

  • Boa tarde.

    Tu podes usar transações para realizar isso; basicamente tu começas uma transação, executa vários comandos e ao final, dá um commit ("salvar" as mudanças feitas) ou um rollback (não salvar as mudanças), caso algum problema foi encontrado.

    AQUI tem um exemplo prático.


    Att., Rafael Simor

    • Marcado como Resposta Vinicius_kruz sábado, 7 de novembro de 2015 18:35
    sábado, 7 de novembro de 2015 16:13
  • Boa noite,

    Amigo use o IsolationLevel.Serializable no escopo da transação para não bloquear as tabelas.

    Mais ou menos assim.

    SqlTransaction tran;
    tran = seuObjBanco.BeginTransaction(IsolationLevel.Serializable);

    dessa forma quando chamar o rollback irá desfazer as inserções anteriores.

    Espero ter ajudado!


    *****************************************************
    Rafael Almeida Programador Sênior - JAMSOFT Sistemas
    rafaelalmeida@jamsoft.com.br
    www.jamsoft.com.br
    *****************************************************
    Asp.Net 5 Vnext, C# 6, Entity Framework e SQL Server
    *****************************************************

    • Marcado como Resposta Vinicius_kruz segunda-feira, 9 de novembro de 2015 11:12
    sábado, 7 de novembro de 2015 23:22

Todas as Respostas

  • Boa tarde.

    Tu podes usar transações para realizar isso; basicamente tu começas uma transação, executa vários comandos e ao final, dá um commit ("salvar" as mudanças feitas) ou um rollback (não salvar as mudanças), caso algum problema foi encontrado.

    AQUI tem um exemplo prático.


    Att., Rafael Simor

    • Marcado como Resposta Vinicius_kruz sábado, 7 de novembro de 2015 18:35
    sábado, 7 de novembro de 2015 16:13
  • Obrigado Rafael, sua dica foi de grande ajuda, Deus o abençoe!!!
    sábado, 7 de novembro de 2015 18:35
  • Boa noite,

    Amigo use o IsolationLevel.Serializable no escopo da transação para não bloquear as tabelas.

    Mais ou menos assim.

    SqlTransaction tran;
    tran = seuObjBanco.BeginTransaction(IsolationLevel.Serializable);

    dessa forma quando chamar o rollback irá desfazer as inserções anteriores.

    Espero ter ajudado!


    *****************************************************
    Rafael Almeida Programador Sênior - JAMSOFT Sistemas
    rafaelalmeida@jamsoft.com.br
    www.jamsoft.com.br
    *****************************************************
    Asp.Net 5 Vnext, C# 6, Entity Framework e SQL Server
    *****************************************************

    • Marcado como Resposta Vinicius_kruz segunda-feira, 9 de novembro de 2015 11:12
    sábado, 7 de novembro de 2015 23:22
  • Bem lembrado Rafael Almeida, eu até estudei um pouco a respeito disso, mas não entendi direito como usar, agora com a sua dica ficou mais fácil, muito obrigado!
    segunda-feira, 9 de novembro de 2015 11:11