Forma boa de uso de CONEXOES COM BD
Estou desenvolvendo um software de banco de dados, mas nao utilizo nenhum componente dbedit, dbcombo,.. ect, nos forms, somente em algumas e raras consultas uso o DbGrid, de resto eu faço manualmene as inclusoes, alteracoes, consultas tudo atraves de funcoes (SqlConnection + SQLQury).
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
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
Curtidas 0
Respostas
Andre Raposo
23/12/2004
Estou desenvolvendo um software de banco de dados, mas nao utilizo nenhum componente dbedit, dbcombo,.. ect, nos forms, somente em algumas e raras consultas uso o DbGrid, de resto eu faço manualmene as inclusoes, alteracoes, consultas tudo atraves de funcoes (SqlConnection + SQLQury).
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
Camarada...
A forma de conecção de BD mais interessante é quando se tem performace, porém a conecção de BD mais apropriada, na minha opinião, S/ao os componentes da paleta DBExpress usando naturalmente o ClientDataSet, e o DataSetProvider da paleta DataAccess. Pra mim é a melhor conecção. Em relação aos DBEdit´s DBCombo´s São interessantes dependendo do seu conhecimento, é a melhor opção.
Espero que eu tenha exclarecido
André
Julio
GOSTEI 0
Tuskinhu
23/12/2004
[quote:01b3104c00=´Tuskinhu´]Estou desenvolvendo um software de banco de dados, mas nao utilizo nenhum componente dbedit, dbcombo,.. ect, nos forms, somente em algumas e raras consultas uso o DbGrid, de resto eu faço manualmene as inclusoes, alteracoes, consultas tudo atraves de funcoes (SqlConnection + SQLQury).
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
Camarada...
A forma de conecção de BD mais interessante é quando se tem performace, porém a conecção de BD mais apropriada, na minha opinião, S/ao os componentes da paleta DBExpress usando naturalmente o ClientDataSet, e o DataSetProvider da paleta DataAccess. Pra mim é a melhor conecção. Em relação aos DBEdit´s DBCombo´s São interessantes dependendo do seu conhecimento, é a melhor opção.
Espero que eu tenha exclarecido
André
Julio
[/quote:01b3104c00]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
Biscalquini
23/12/2004
É isso aí amigo, estou mandando como se faz transações pelo SQLQuery, resolvi muitos problemas com isso:
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.
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]
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
Tuskinhu
23/12/2004
Cara!!! isso é muito estranho!!!
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 ?
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
Biscalquini
23/12/2004
Tem uma propriedade, dentro de Params, que se chama CommitRetain, no meu deixo como FALSE, esta opção dá um auto commit nas transações diretas com o banco de dados, talvez a sua esteja como TRUE
GOSTEI 0
Tuskinhu
23/12/2004
outra dúvida, eu estou em Delphi 7, usei o esqueleto de sua funçao aqui, mas dá erro no MessageBox(), tenho q declarar alguma unit específica ou usar com o application.messagebox ?
GOSTEI 0
Biscalquini
23/12/2004
Declare a Unit
uses Windows
GOSTEI 0