DUVIDA TRANSACAO
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
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
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.
qual banco de dados vc está utilizando?
se for mysql, vc pode fazer assim na sua query:
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
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
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 ?
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 ?
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.
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
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
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