mam problem dotyczący komunikacji pomiędzy klientem a serwerem przy uzyciu komponentów DATASNAP i Delphi 2010 Ent.
Po stronie klienta tworzę dataset (klasy Tclientdataset), którego zawartość, jako parametr metody wyeksportowanej z serwera (metoda "pobierz_sprzedaz"), zostaje przesłana do serwera. I tu wszystko jest ok , serwer prawidłowo odbiera i przetwarza otrzymane dane, oraz zwraca wynik .
Problem pojawia się, gdy po stronie klienta usiłuję zwolnić utworzony dataset metodą ".free" , bo wtedy pojawia się wyjątek "invalid pointer operation".
Nie wiem gdzie zrobiłem błąd, pozornie wszystko proste, a nie działa prawidłowo ...
Będę wdzięczny za pomoc w rozwiązaniu problemu ....
poniżej w skrócie kod programu generujący wyjątek
w skrócie kod aplikacji
ClientDataSet1 := TClientDataSet.Create(self);
/// tutaj nastepuje zdefiniowanie pól w Clientdataset1 i wypełnienie ich danymi
//// ....
///...
proxy := TServerMethods1Client.Create
(self.DATASNAPCONNECTION.DBXConnection);
wynik:= proxy.pobierz_sprzedaz(ClientDataSet1);
proxy.Free;
/// poniższa linia generuje opisany powyżej wyjątek
ClientDataSet1.Free;
tak wygląda metoda "pobierz_sprzedaz" po stronie klienta:
function TServerMethods1Client.pobierz_sprzedaz(sprzedaz: TDataSet): Double;
begin
if Fpobierz_sprzedazCommand = nil then
begin
Fpobierz_sprzedazCommand := FDBXConnection.CreateCommand;
Fpobierz_sprzedazCommand.CommandType := TDBXCommandTypes.DSServerMethod;
Fpobierz_sprzedazCommand.Text := 'TServerMethods1.pobierz_sprzedaz';
Fpobierz_sprzedazCommand.Prepare;
end;
Fpobierz_sprzedazCommand.Parameters[0].Value.SetDBXReader(TDBXDataSetReader.Create(sprzedaz, FInstanceOwner), True);
Fpobierz_sprzedazCommand.ExecuteUpdate;
Result := Fpobierz_sprzedazCommand.Parameters[1].Value.GetDouble;
end;
a tak po stronie serwera :
function TServerMethods1.pobierz_sprzedaz(sprzedaz: tdataset): double;
begin
Result := 0;
while not sprzedaz.eof do
begin
Result := Result + sprzedaz.FieldByName('ilosc')
.AsFloat * sprzedaz.FieldByName('cena').AsFloat;
sprzedaz.next;
end;
/// tutaj zapis do bazy i jeszcze parę innych operacji
/// .....
/// .....
end;