DUVIDA TRANSACAO

GIROCAMP 21/12/2011 16:13:39
#391787
Estou iniciando com programação vb.net e estou com algumas.....
Estou desenvolvendo um sistema O.O, sempre que vou inserir, atualizar ou deletar um registro da tabela executo um metodo que desenvolvi, este metodo conecta com o banco de dados, executa o comando e fecha a conexao com o banco.

Tenho uma tela no sistema onde o usuario pode inserir varios itens (utilizei uma datagridview) e quando clicar em salvar eu salvo as informaçoes na tabela.
Gostaria de saber se tem uma forma de controlar a transaçao de forma que ou salve tudo ou nao salve nada.

Este é o metodo que eu fiz para executar o comando

Public Sub ExecutarComando(ByVal strQuery As String)

Dim cn As New SqlConnection()
Try
[ô]Abrir o banco de dados e passar os
[ô]parametros da consulta SQL, parametros
[ô]e ordem de execução.

cn = AbrirBanco()

Dim cmdCommand As New SqlCommand
cmdCommand.CommandText = strQuery.ToString
cmdCommand.CommandType = CommandType.Text

cmdCommand.Connection = cn
cmdCommand.ExecuteNonQuery()

Catch ex As Exception
Throw ex
Finally
FecharBanco(cn)
End Try

End Sub



Obrigado pela ajuda.
Lucas
KERPLUNK 21/12/2011 16:37:38
#391790
Citação:

Gostaria de saber se tem uma forma de controlar a transaçao de forma que ou salve tudo ou nao salve nada.



Estou supondo que vc tenha algumas operações em que salva registros em lote. Nesse caso, o melhor é trabalhar com classes e métodos específicos para gravação. Enfim orientação a objeto mesmo. O truque disso é que vc fazendo dessa maneira, a própria conexão é uma classe, que vc pode tornar como singleton, assim, vc vai ter uma única conexão sendo usada em diferentes objetos.
Claro que vc pode simplesmente implementar o singleton para uma classe de conexão e nela mesmo iniciar a transação, finalizando a transação no dispose da classe.
LROSSI 21/12/2011 17:19:37
#391797
qual banco de dados vc está utilizando?

se for mysql, vc pode fazer assim na sua query:

  
START TRANSACTION;

update t1 set tt=yy;
//vai colocando suas querys e executando no intervalo entre o start e o commit

COMMIT;


pois o mysql por padrão vem com [Ô]auto commit[Ô] ativado para cada instrução enviada ao servidor. Esta seria a forma de fazer tudo ou não fazer nada em caso de erro em algum comando.

http://dev.mysql.com/doc/refman/5.0/en/commit.html
GIROCAMP 23/12/2011 10:42:31
#391901
Oi obrigado pelas respostas... mas to meio em duvida ainda ... nao tenho mta experiencia em orientaçao a objetos...e menos ainda em vb.net rsrs

Estou utilizando o SQL Server.
Eu criei uma classe ItensdoPedido onde tem alguns metodos como Gravar(), Excluir() e Alterar() ... nesses 3 metodos eu apenas crio a string com o comando desejado e chamo o método ExecutarComando() que eu ja postei na mensagem anterior....

A minha duvida é... dessa forma que eu programei sempre que eu inserir uma linha na minha grid de itens irei chamar o metodo Gravar() da classe ItensPedido e ela por sua vez ira chamar o metodo ExecutarComando() ... que ira criar uma conexao com o banco de dados executar o comando e fechar a conexao... portando os dados ja ficarao salvos na minha tabela...

Como estou programando em 3 camada nao poderia colocar todo o codigo no botão certo? nao posso criar a conexao percorrer a grid e ir dando insert ?

FOXMAN 27/12/2011 15:37:01
#392003
GiroCamp, a melhor maneira de você controlar as transações é como o amigo Nilson exemplificou, no teu caso você pode ainda criar uma class static onde qualquer operação que exija transações possa ser instanciada.

O exemplo que o LROSSI passou ficaria muito interessante se você utilizar procedures, dessa forma ficaria desnecessário o uso de transações diretamente no código.

Citação:

:
qual banco de dados vc está utilizando?

se for mysql, vc pode fazer assim na sua query:

  
START TRANSACTION;

update t1 set tt=yy;
//vai colocando suas querys e executando no intervalo entre o start e o commit

COMMIT;


pois o mysql por padrão vem com [Ô]auto commit[Ô] ativado para cada instrução enviada ao servidor. Esta seria a forma de fazer tudo ou não fazer nada em caso de erro em algum comando.

http://dev.mysql.com/doc/refman/5.0/en/commit.html




GIROCAMP 02/01/2012 10:45:57
#392255
Obrigado a todos pela ajuda.
Deu certo aqui ... criei o método abaixo onde passo os comandos que quero executar em uma string ...

Public Sub Transacao(ByVal strQuery As String)

Dim cn As New SqlConnection()
Dim transaction As SqlTransaction

cn = AbrirBanco()
transaction = cn.BeginTransaction
Try
Call (New SqlCommand(strQuery.ToString, cn, transaction)).ExecuteNonQuery()
transaction.Commit()
Catch ex As Exception
transaction.Rollback()
Throw ex
Finally
FecharBanco(cn)
End Try
End Sub
Tópico encerrado , respostas não são mais permitidas