Fórum problema 3 camadas com clientdataset e poo #332390
31/10/2006
Pessoas é o seguinte, eu postei uma mensagem aqui hoje cedo, após muita pesquisa eu desobri mais ou menos o que acontece, eu estou fazendo meu TCC em 3 camadas e orientado a objetos, o ´botão´ da minha aplicação chama um método da minha aplicação servidora, esta instancia, passa alguns parâmetros para o objeto( no caso, é um objeto da classe usuário , que eu uso para fazer verificações de permissão) e este método da classe, trabalha manipulando um TSQLQuery. Eu tenho um Client Dataset ligado nessa query na aplicação cliente, o problema é o seguinte, o clientdataset tem por padrão abrir e fechar a query, pois ele utiliza os dados somente quando ele precisa, mas a minha aplicação servidora, precisa desse query sempre ligado, pois qualquer método que é chamado, pega o coduser da query para gravar no registro da tabela correspondente, apenas a fins de auditoria. Como posso usar o query dataset ligado nessa query e mante-la sempre aberta, sem que o clientdataset a fecha sozinha ?
Posts
na verdade quem fecha a query é o DataSetprovider
Porem não conheço nenhuma propriedade que impeçaque isto ocorra
Mas se voce colocar depois do Dm.CdsUsuario.Open;
o comando Dm.SuaQuery.Active:=True; ela não ficara aberta ????
procedure TFrmLogin.ActLoginExecute(Sender: TObject);
begin
validado:=false;
If Dm.conMercado.AppServer.ValidaUsuario(
EdtUsuario.text,EdtSenha.text)=´VALIDO´ then
begin
validado:=true;
close;
Dm.CdsUsuario.Open;
//Dm.CdsUsuario.Refresh;
end
else
begin
Application.MessageBox(´Senha ou usuário Incorreto, Tente novamente´,
´Dados Incorretos´, mb_IconExclamation + MB_OK);
EdtSenha.SetFocus;
end;
end;
na verdade não, olha só que estranho, como eu uso essa qryusuarios para fazer a validação do login com clientdataset e também utilizo para métodos da minha aplicação servidora( daí a necessidade de ela estar sempre aberta), eu criei outro método na aplicação servidora para fazer a mesma coisa com um outro SqlQuery, chamado SqlLogin, só olha que estranho, a ClientDataSet parou de ficar linkada no qryusuarios, e mesmo sendo ligada agora em sqllogin, e mesmo assim, ele continua dando esses paus de não encontrar campo coduser por exemplo, nunca vi nada igual
eu não entendi ???
Voce disse na sua replica :
na verdade não,
Na verdade não o que ???
esta sua afirmação é sobre :
na verdade quem fecha a query é o DataSetprovider [b:fe54e7c309]ou sobre[/b:fe54e7c309]
Mas se voce colocar depois do Dm.CdsUsuario.Open;
o comando Dm.SuaQuery.Active:=True; ela não ficara aberta ????
na verdade não :
´Mas se voce colocar depois do Dm.CdsUsuario.Open;
o comando Dm.SuaQuery.Active:=True; ela não ficara aberta ???? ´
achei muito estranho, estou utilizando um outro objeto TQuery que não tem DatasetProvider ligado, usando o mesmo método que o que tem usa, mas ele também esta fechando sozinho, e o gozado, é que estou utilizando a palavra var na frente dos parâmetros para ele não tirar cópia e fazer no objeto mesmo :
procedure TUsuario.RetornaUsuarioSenha(var SqlAux: TSqlQuery;
Conexao: TSqlConnection);
begin
With SqlAux do
begin
Close;
SqlConnection:=conexao;
Sql.Clear;
Sql.Add(´SELECT * FROM USUARIO´);
Sql.Add(´WHERE LOGIN=:USUARIO´);
Params.ParamByName(´USUARIO´).AsString:=nome;
Open;
end;
end;
sinceramente, não entendo o que possa estar acontecendo !
´Mas se voce colocar depois do Dm.CdsUsuario.Open;
o comando Dm.SuaQuery.Active:=True; ela não ficara aberta ???? ´
[b:86e935c052]Era para ficar aberto... Desde que a conexão esteja aberta[/b:86e935c052]
Voce tem certeza , que a sua conexão esta aberta ????
Existe a propriedade KeepConeection que se pode controlar o fechamento ou não da conexão com o banco...
tenho certeza que ela esta aberta, afinal, é para isso que serve o var na frente de SqlAux, onde SqlAux é a query que eu estou passando como parâmetro, isso quer dizer , ele vai lá, pega essa query, limpa a propriedade Sql dela, adiciona umas linhas do sql e dá o método open, que é equivalente a active:=true. E pelo fato de ter o var na frente, ele não tira cópia da query e trabalha na cópia, e sim, ele trabalhar diretamente com a query.só que o mais estranho é que eu coloquei um método na que verifica se a query esta aberta e me dar um showmessage e ele me da o showmessage do else, dizendo que ela esta fechada. Já estou há 3 dias com este problema, e ja patinei 24 horas ao total e não consegui resolver, antes eu estava usando apenas uma query, que serviria para validar o usuário e ficar com essa linha enquando o sistema tivésse aberto para o usuário, mas como eu tinha um dataset provider ligado nele para usar um client dataset, e descobri que o datasetprovider abre e fecha sozinho a query, conforme necessidade, ai eu coloquei no dm mais uma query e criei um novo método , que é esse abaixo, só para ele trabalhar com essa nova query que não tem o datasetprovider associada a ela e não correr este risco de ficar fechando sozinho, o mais estranho é o seguinte, no evento beforeopen dessa query nova eu coloquei um showmessage ´ABRINDO SQL TESTE´ e no evento beforeclose eu coloquei um showmessage ´FECHANDO SQL TESTE´ e quando ele abre a query ele me dá o showmessage, quando ele esta fechando não recebo mensagem algum ! muito estranho essa parada ! se alguém ja passou por algo par
procedure TUsuario.RetornaUsuarioSenha(var SqlAux: TSqlQuery;
Conexao: TSqlConnection);
begin
With SqlAux do
begin
Close;
SqlConnection:=conexao;
Sql.Clear;
Sql.Add(´SELECT * FROM USUARIO´);
Sql.Add(´WHERE LOGIN=:USUARIO´);
Params.ParamByName(´USUARIO´).AsString:=nome;
Open;
end;
end;
ecido, por favor, me ajude
alias, deveria estar aberta, mas não esta !
alias, deveria estar aberta, mas não esta !
Voce esta se referindo a conexão ????
não, estou me referindo a Query, deveria estar aberta, mas não está, estarei vendo se consigo colocar as fotos do meu problema em algum lugar, para vcs tentarem me ajudar.
não, estou me referindo a Query, deveria estar aberta, mas não está, estarei vendo se consigo colocar as fotos do meu problema em algum lugar, para vcs tentarem me ajudar.
mas me refiro também a conexão ela esta aberta ??? :?: :?:
sim, a conexão fica sempre aberta, eu deixo ela com true em tempo de projeto, me da seu email que vou tentar anexar os snapshots que tirei explicando o problema, não sei anexar foto por aqui, acho que só da se ela ja estiver na web, certo ?
sim, a conexão fica sempre aberta, eu deixo ela com true em tempo de projeto,
Mas isto não garante que ela permaneça aberta... Com oeu disse antes .. Existe a propriedade KeepConnection que pode fechar esta conexão , sem que voce perceba
to te enviando o email com os snapshots