Problemas com ADO: Não está efetivando transação
Caros companheiros de programação!
É a primeira vez que participo deste fórum para pedir ajuda. :wink:
Eu estou trabalhando com Deplhi 5, BD SQL Server e usando ADO p/ a conexão c/ o BD.
O problema é o seguinte: quando inicio uma transação(BeginTrans) no AdoConnection(onde mais?), faço as modificações e dou um CommitTrans, a primeira vista na aplicação parece que gravou tudo ok, mas no servidor não aparece nenhuma modificação, é como se não tivesse feito nada ou tivesse dado um RollbackTrans.
Desde já agradeço a colaboração de vocês, e peço por favor que me ajudem(se puderem)! [b:723802b085]URGENTE! :!: [/b:723802b085]
Obrigado.
[color=green:723802b085]Título editado por gandalf.nho. Removido URGENTE![/color:723802b085]
É a primeira vez que participo deste fórum para pedir ajuda. :wink:
Eu estou trabalhando com Deplhi 5, BD SQL Server e usando ADO p/ a conexão c/ o BD.
O problema é o seguinte: quando inicio uma transação(BeginTrans) no AdoConnection(onde mais?), faço as modificações e dou um CommitTrans, a primeira vista na aplicação parece que gravou tudo ok, mas no servidor não aparece nenhuma modificação, é como se não tivesse feito nada ou tivesse dado um RollbackTrans.
Desde já agradeço a colaboração de vocês, e peço por favor que me ajudem(se puderem)! [b:723802b085]URGENTE! :!: [/b:723802b085]
Obrigado.
[color=green:723802b085]Título editado por gandalf.nho. Removido URGENTE![/color:723802b085]
Rogick
Curtidas 0
Respostas
Rjun
30/06/2005
Coloque o trecho de código onde você faz a operação com o BD. Você está utilizando stored procedure?
GOSTEI 0
Rogick
30/06/2005
Valeu pela atenção.
Eu já consegui resolver parte do problema, o Commit está funcionando. eeehh! :D
Eu só mudei o cursor location do ADOConnection p/ clUseServer
Agora a outra parte do problema.
Primeiro vou explicar o que eu estou fazendo:
Eu estou usando 2 TADOQueries(CursorLocation = clUseClient) para fazer a gravação e algumas tabelas e executando algumas stored procedures via query. Até aí tá tudo bem, ele grava certinho, mas acontece que eu preciso pegar os dados com outra TADOQuery ligada ao mesmo ADOCOnnection de uma inserção que fiz(ainda dentro da transação) para o usuário fazer umas alterações em outra tela para depois fazer a gravação definiva, e ele não consegue pegar.
E agora? É o fim ...
E também tem outra, se eu colocar o CursorLocation de todo mundo p/ clUseServer ele dá o erro ´A new transaction could not be created due unspecified capacity issue´ + ou - ´Uma nova transação não pode ser criada devido a edição de capacidade não especificada´
Se alguém sober como resolver, por favor me ajude.
Desde já agradeço pela atenção.
PS: Não vou enviar o código, pq ele é muito extenso e envolve + d um form
Eu já consegui resolver parte do problema, o Commit está funcionando. eeehh! :D
Eu só mudei o cursor location do ADOConnection p/ clUseServer
Agora a outra parte do problema.
Primeiro vou explicar o que eu estou fazendo:
Eu estou usando 2 TADOQueries(CursorLocation = clUseClient) para fazer a gravação e algumas tabelas e executando algumas stored procedures via query. Até aí tá tudo bem, ele grava certinho, mas acontece que eu preciso pegar os dados com outra TADOQuery ligada ao mesmo ADOCOnnection de uma inserção que fiz(ainda dentro da transação) para o usuário fazer umas alterações em outra tela para depois fazer a gravação definiva, e ele não consegue pegar.
E agora? É o fim ...
E também tem outra, se eu colocar o CursorLocation de todo mundo p/ clUseServer ele dá o erro ´A new transaction could not be created due unspecified capacity issue´ + ou - ´Uma nova transação não pode ser criada devido a edição de capacidade não especificada´
Se alguém sober como resolver, por favor me ajude.
Desde já agradeço pela atenção.
PS: Não vou enviar o código, pq ele é muito extenso e envolve + d um form
GOSTEI 0
Paullsoftware
30/06/2005
eu uso Access e nunca aconteceu isso comigo... faz o seguinte pode ser que te ajude, coloca esse código nos eventos affterDelete,AffterPost do componente TADO...
outra coisa, esse erro pode ser devido a alguma referencia circular que esteja acontecendo no seu banco, pq o ideal é que use em todos componentes o [b:935abe30f2]CursorLocation = clUseServer[/b:935abe30f2], pois, essa propriedade serve para defenir se os dados serão manipulados diretamente no servidor ou no cliente... mesmo se for um banco local o ideal é usar como clUseServer...
espero ter ajudado!!! :wink:
if not conexao.InTransaction then conexao.BeginTrans; try if conexao.InTransaction then conexao.CommitTrans except if conexao.InTransaction then conexao.RollbackTrans; end;
outra coisa, esse erro pode ser devido a alguma referencia circular que esteja acontecendo no seu banco, pq o ideal é que use em todos componentes o [b:935abe30f2]CursorLocation = clUseServer[/b:935abe30f2], pois, essa propriedade serve para defenir se os dados serão manipulados diretamente no servidor ou no cliente... mesmo se for um banco local o ideal é usar como clUseServer...
espero ter ajudado!!! :wink:
GOSTEI 0
Bon Jovi
30/06/2005
´pq o ideal é que use em todos componentes o CursorLocation = clUseServer´
Depende do caso, clUseServer é bom ser usado em situações de processamento temporário, em que o DataSet não fique aberto pro usuário (com ClientDataSet até pode nao ter problemas, pois usa o ADODataSet/ADOQuery temporariamente/qdo necessário. Mesmo assim prefiro clUseClient com ClientDataSet).
clUseServer gera mais tráfego na rede se deixar o dataset pro usuário brincar, onde a cada navageção no DataSet ele sempre vai acessar a rede. O dataset fica sempre ´ligadão´ no servidor.
clUseClient já traz a query solicitada toda pra um cache local, liberando o servidor de uma vez só. Manter a aplicação ´linkada´ ao servidor o tempo todo não é uma boa pra aplicações Client/Server com muita concorrência.
Exemplos:
Pra obter total velocidade em processamentos manuais, onde se garanta o fechamento do DataSet antes de liberar o resultado pro usuário, acho ideal usar CursorLocation = clUseServer + CursorType = ctOpenForwardOnly.
Pra exibir dados em DBGrids e previews de relatórios acho o ideal é CursorLocation = clUseClient + CursorType = ctStatic. De preferência, é claro, com ClientDataSet.
Existem tb outras situações em que um é mais adequado usar um ou outro..., tudo vai depender da situação.
GOSTEI 0