Fórum Problemas com ADO: Não está efetivando transação #286571
30/06/2005
0
É 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
Curtir tópico
+ 0Posts
01/07/2005
Rjun
Gostei + 0
01/07/2005
Rogick
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
01/07/2005
Paullsoftware
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
01/07/2005
Bon Jovi
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
Clique aqui para fazer login e interagir na Comunidade :)