Forma boa de uso de CONEXOES COM BD

Delphi

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
Julio


Tuskinhu

Tuskinhu

Curtidas 0

Respostas

Andre Raposo

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

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

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.

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

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 ?


GOSTEI 0
Biscalquini

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

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

Biscalquini

23/12/2004

Declare a Unit

uses Windows



GOSTEI 0
POSTAR