Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   DataSnap und der Zugriff auf Datenbanken (https://www.delphipraxis.net/177390-datasnap-und-der-zugriff-auf-datenbanken.html)

RWarnecke 4. Nov 2013 18:14

Datenbank: Firebird • Version: 2.5 • Zugriff über: UniDAC

DataSnap und der Zugriff auf Datenbanken
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

ich habe jetzt einige Tutorials durchgelesen zu DataSnap und ich muss sagen, dass Thema interessiert mich sehr, da ich hier einiges Potenzial für meine Anwendungen sehe. Ich habe nur leider noch nicht die Arbeitsweise von DataSnap verstanden. Im Anhang habe ich ein kleines Beispielprogramm mit UniDAC erstellt, welches entsprechend auf die Datenbank zugreift und auch die Daten entsprechend abrufen kann. Jetzt nun zu meiner Frage, muss ich im DataSnap Server für jede Abfrage zu Datenbank eine eigene Funktion schreiben oder kann ich den entsprechenden SQL Befehl auf dem Client auch zusammenbauen und dann zum Server schicken ? Wenn ja, wie muss ich das machen, wo muss ich ansetzen ?

Im Beispiel habe ich alle relevanten Datenbankserverdaten entfernt.

Uwe Raabe 4. Nov 2013 23:14

AW: DataSnap und der Zugriff auf Datenbanken
 
Du kannst im Client dem ClientDataSet über das property CommandText die passende SQL-Anweisung mitgeben, die du auch noch bei Bedarf mit den Params garnieren kannst.

RWarnecke 5. Nov 2013 03:56

AW: DataSnap und der Zugriff auf Datenbanken
 
Hallo Uwe,

danke erstmal für Deine Antwort. Ich verstehe im Moment noch nicht ganz, wie ich die Eigenschaft Commandtext anwenden soll. Zuerst habe ich immer den Fehler "CommandText change not allowed" bekommen. Den Fehler habe ich jetzt wegbekommen, indem ich die Eigenschaft poAllowCommandText im TDataSetProvider im Client auf True gesetzt habe. Zusätzlich habe ich die Eigenschaft ServerMethods von TSQLServerMethod von TServerMethods.GetKunden auf DSAdmin.GetConnection gesetzt. Dann habe ich die Procedure Btn_OpenDataSetClick aus meinem Beispiel wie folgt geändert :
Delphi-Quellcode:
  DM.ClientDS_Main.CommandText := 'SELECT * FROM ZIPCODE;';

  if not DM.ClientDS_Main.Active then
    DM.ClientDS_Main.Active := True;

  if DM.ClientDS_Main.Active then
  begin
    LB_Fullname.Items.Clear;
    while not DM.ClientDS_Main.Eof do
    begin
      LB_Fullname.Items.Add(DM.ClientDS_Main.FieldByName('ZIPCODE').AsString + ' ' + DM.ClientDS_Main.FieldByName('CITY').AsString);
      DM.ClientDS_Main.Next;
    end;
    DM.ClientDS_Main.Active := False;
  end;
end;
Wenn ich jetzt die obenstehende Procedure ausführe bekomme ich den folgenden Fehler :

---------------------------
Debugger Exception Notification
---------------------------
Project DataSnapTestClient.exe raised exception class TDBXError with message 'Remote error: SELECT method not found in the server method list'.
---------------------------
Break Continue Help
---------------------------

Was habe ich da noch falsch gemacht ? Wie und woher weiß mein Client, an welche Query im Server der Command Text weitergegeben werden muss ?

jaenicke 5. Nov 2013 06:10

AW: DataSnap und der Zugriff auf Datenbanken
 
Ich hab keine Zeit, deshalb nur ganz kurz. Bei uns gibt es mehrere Servermethoden, z.B. OpenQuery oder OpenTable, die jeweils:
  • über FireDAC zentral ein Dataset erstellen, TFDQuery oder TFDTable
  • einen Dataset-Provider erstellen
  • diese Informationen in der Serververwaltung über die Sessions speichern
  • den von uns automatisch generierten Providernamen zurückliefern
So können wir auch einfach serverseitig anzeigen wer was offen hat, den Verbindungsstatus ebenfalls, am Ende aufräumen, auch wenn die Verbindung abreißt, ...

// EDIT:
Und Clientseitig haben wir ein TClientDataSet, dem wir die TSQLConnection und den zurückgelieferten Providernamen zuweisen.

arnof 5. Nov 2013 07:58

AW: DataSnap und der Zugriff auf Datenbanken
 
Mal ein Beispiel, das nimmt eine SQL-Anweisung entgegen und gibt ein TDataSet zurück.

Delphi-Quellcode:
function TServerMethods1.GetSQLDataSet(ID,SQL: string): TDataSet;
var t1,t2:TTime;
begin
  AFSQuery1.Close;
  AFSQuery1.SQL.Text:=SQL;
  try
   t1:=now;
   AFSQuery1.Open;
   T2:=now;
   Result := AFSQuery1;
   FM_Haupt.RE_LOG.Lines.Add('ID:'+ID+'/SQL:'+IntToStr(AFSQuery1.RecordCount)+';'+SQL+' '+TimeToStr(now-t1));
  except
   on E: Exception do begin
    FM_Haupt.RE_LOG.Lines.Add('ERROR: '+e.Message);
    FM_Haupt.RE_LOG.Lines.Add('SQL: '+SQL);
    //
    Result := nil;
   end;
  end;
end;
PS: das logt noch etwas mit und macht auch eine Zeitmessung, d.h. alles mit FM_HAUPT kannste entfernen ;-)

AFSQuery ist eine beliebige Query Komponente

Uwe Raabe 5. Nov 2013 08:25

AW: DataSnap und der Zugriff auf Datenbanken
 
Ich kann dein Projekt hier mangels UniDAC leider nicht öffnen. Daher hier nur eine Trockenübung:

Im Client ist dein DataSet über den lokalen Provider DSProv_Main mit der ServerMethod SQLSrvMethod_Main verbunden. Damit läuft immer alles über die ServerMethod. Das wollen wir hier aber nicht.

Platziere im Server eine weitere Query und einen DataSetProvider und setze dessen DataSet property auf die Query. Gib dem DataSetProvider einen adäquaten Namen. Das mit dem poAllowCommandText hast du ja schon selbst rausgefunden.

Setze bei dem ClientDataSet das Property RemoteServer auf die SQLCOnnection. Dann sollte dir bei ProviderName auch der neue DataSetProvider angezeigt werden. Wähle den aus und dein ClientDataSet ist mehr oder weniger direkt mit der Query verbunden.

Edit: Ich hatte noch vergessen (das kommt davon, wenn man das Projekt nicht öffnet) - du musst im Client noch eine TDSProviderConnection platzieren, die mit der SQLConnection verbunden wird. Diese wird dann im ClientDataSet als RemoteServer ausgewählt.

RWarnecke 5. Nov 2013 21:09

AW: DataSnap und der Zugriff auf Datenbanken
 
Hallo Uwe,

bin erst jetzt zum Ausprobieren gekommen. Danke für Deine Trockenübung. Ich habe alles hinbekommen und es funktioniert zumindest in meiner Demo. Jetzt werde ich es versuchen in einem Produktivprogramm umzusetzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz