Fórum Forma boa de uso de CONEXOES COM BD #263241
23/12/2004
0
Uma dúvida é se eu posso aplicar transaçoes no SQLQuery, fiz uns testes mas eu acho que nao deu certo, entao eu uso o ClientDataSet conectado ao SQLCOnnection para usar... gostaria de saber se esse é um modo ´profissional´ de acessar o BD, ou se devo usar os comps como DBEdit, DBCombo... e como e se pode utilizar transacoes com o TSQLQuery..
Obrigado e Feliz Natal a Todos
Julio
Tuskinhu
Curtir tópico
+ 0Posts
23/12/2004
Andre Raposo
Gostei + 0
23/12/2004
Tuskinhu
Correto, eu estou usando a palheta dbepress, mas soh utilizo os ClientDataSet, e o DataSetProvider qdo preciso fazer uma consulta bi-direcional, é o caso de eu usar um dbgrid pra algumas consultas, e quanto ao uso de transaçoes com TSQLQuery (dbExpress) vc sabe se ela aceita as transaçoes, pq eu fiz um teste aqui e ele nao aceitou, quer dizer, aceitou, mas eu fiz um teste do tipo, coloquei um dialog perguntando se eu queria comitar a transaçao e em todas q respondi q nao ou q sim ele comitou... gostaria q saber se vc tem alguma ideia disso, se eu estou errado ou nao, pois usei o mesmo esquema com o TSQLDataSet e funcionou numa boa, dependendo da minha resposta eu comitava ou dava rollbak...
:)
Gostei + 0
23/12/2004
Biscalquini
QrTransacao - é um SQLQuery, que incrementa um generator no banco de dados, para cada transação vc precisa de um número, e assim ele não se repete, a cada backup e restore no banco o contador de transações zera, aí vc pode zerar o generator.
var TR: TTransactionDesc; Mensagem: String; procedure Grava; begin If not SQLConnection1.InTransaction Then Begin With QrTransacao, SQL do Begin Close; Clear; Add(´SELECT CAST(GEN_ID(TRANSACAO_GENERATOR,1) ´); Add(´AS INTEGER) AS TRANSACAO FROM RDB$DATABASE´); Open; TR.TransactionID:=Fields[0].AsInteger; Close; End; TR.IsolationLevel:=xilREADCOMMITTED; SQLConnection1.StartTransaction(TR); Try With SQLQuery1, SQL do Begin Close; Clear; Add(´COMANDOS DA SUA QUERY´); ExecSQL(); End; SQLConnection1.Commit(TR); Except On E: Exception do Begin SQLConnection1.Rollback(TR); Mensagem:=´Ocorreu um erro´+#13+13+E.Message; MessageBox(0,PChar(Mensagem),´Erro crítico!´, MB_OK+MB_ICONERROR+MB_TOPMOST+MB_TASKMODAL); Abort; End; End; End; end;
Este só um exemplo para executar uma query, se vc tiver que fazer um processo que deve ser um todo, uma manipulação de estoque por exemplo, é só colocar os SQL´s antes de ´SQLConnection1.Commit(TR);´.
Assim se todas as querys forem executadas com sucesso ele confirma a gravação com o Commit, senão, se pelo menos uma delas falhar, ele dá um Rollback e tudo o que estava sendo feito naquela transação é desfeito.
Espero ter ajudado e resolvido o seu problema, só mais um conselho, procure não usar o SQLStoredProc, tive alguns problemas ao mandar executa-los, com o SQLQuery o sucesso da gravação dos dados é garantido
Se precisar de mais alguma coisa, entre no meu MSN:
[b:0c2e6dedc9]biscalquini@hotmail.com[/b:0c2e6dedc9]
Gostei + 0
23/12/2004
Tuskinhu
Eu tudo = e nao precisava dar commit !!! A transacao era comitada como se fosse automático, mesmo eu dando um rollback...
Existe algum parametro na Query ou no SqlConnection q tem um tipo digamos Autocommit ?
Gostei + 0
24/12/2004
Biscalquini
Gostei + 0
24/12/2004
Tuskinhu
Gostei + 0
27/12/2004
Biscalquini
uses Windows
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)