Usuário com melhor resposta
Dúvida SqlCommand e transações

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.
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
- Marcado como Resposta Robson Castilho ® terça-feira, 17 de março de 2009 17:51
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
- Marcado como Resposta Robson Castilho ® terça-feira, 17 de março de 2009 17:51
-
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 -
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.