none
Dúvida SqlCommand e transações RRS feed

  • Pergunta

  • Pessoal,


    Em um determinado metodo, executo varias instrucoes SQL dentro de uma transacao da seguinte forma (apenas o trecho que interessa):

    ......
    transacao = conexao.BeginTransaction();

    SqlCommand comando1 = new SqlCommand();

    comando1.Transaction = transacao;

    ......
    comando1.ExecuteNonQuery();
    ......
    -------------------------------

    Para o comando seguinte, crio um novo objeto SqlCommand, ou seja, para cada comando sql na transacao eu crio um objeto Command novo.

    Porem, em determinado instante faço varias inclusoes dentro de um loop (por exemplo itens de uma compra) reaproveitando o mesmo objeto SqlCommand. Eu apenas faço um Clear() nos parametros para poder atribui-los novamente com o item corrente:

    for ......
    {
          .....
          comando7.Parameters.Clear();
          comando7.Parameters.Add(.....................

    }

    Pergunto: existe algum problema em reaproveitar o mesmo objeto Command em relação à transacao ( uma vez que atribuo o objeto Transaction uma unica vez ao command e depois o utilizo no loop executando varios comandos) ??? Se der um erro no banco na 5ª iteraçao no loop a transacao será normalmente revertida?

    Pergunta 2: Se nao há problema, posso utilizar um unico objeto Command no meu metodo para executar todas as instrucoes SQL na transacao ao inves de criar 1 command para cada? De que forma voces fazem?

    Obrigado.




    sexta-feira, 13 de fevereiro de 2009 00:47

Respostas

  • Robson,

    Não vejo este problema ao utilizar esta abordagem.

    Pode inclusive ajudar na coesão e legibilidade do código.

    1) Se o comando foi atrelado à transação, então todas as querys executadas pelo comando vão fazer parte desta transação.
    2) Sim, apenas verifique se os parâmetros do comando serão utilizados corretamente.

    Você pode inclusive reaproveitar um parâmetro, apenas alterando o seu valor.

    Rafael Noronha
    sábado, 14 de fevereiro de 2009 12:54

Todas as Respostas

  • Robson,

    Não vejo este problema ao utilizar esta abordagem.

    Pode inclusive ajudar na coesão e legibilidade do código.

    1) Se o comando foi atrelado à transação, então todas as querys executadas pelo comando vão fazer parte desta transação.
    2) Sim, apenas verifique se os parâmetros do comando serão utilizados corretamente.

    Você pode inclusive reaproveitar um parâmetro, apenas alterando o seu valor.

    Rafael Noronha
    sábado, 14 de fevereiro de 2009 12:54
  • Ola Robson,

    Eu não vejo nenhum problema, apenas faria de uma forma diferente..

    Eu passaria para o Command uma List<SQLParameter>, depois acessava todos os valores através de um for, e por ultimo a cada objeto em vez de usar clear, vc pode instanciar o novo objeto (faria mais sentido),  ficando assim:

    - Instancio um novo Objeto

    - Abre a transação

    - Recebe a lista de parametros e percorre ela usando o Command.Add para dento do objeto Command.

    - Executo comando


    Duvidas poste ai.

    Att
    Nelson Borges - Analista de Sistemas
    quinta-feira, 19 de fevereiro de 2009 00:27
  • Ola pessoal. Aproveitando o topico...

    Estou fazendo testes com transações, e neste ponto me surgiram algumas duvidas:

    se eu não comitar, nem dar rollback, o que acontece? pelo que eu entendi até agora, se comitt, não tem dados gravados, certo?

    E tem alguma possibilidade de trancar outros processos, até que este seja liberado com comitt ou rollback? onde defino o modo de abertura (otimista, pessimista) , e isso vai fazer diferença?


    Julio C.

    sexta-feira, 30 de março de 2012 12:04