AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken DataSnap und der Zugriff auf Datenbanken
Thema durchsuchen
Ansicht
Themen-Optionen

DataSnap und der Zugriff auf Datenbanken

Ein Thema von RWarnecke · begonnen am 4. Nov 2013 · letzter Beitrag vom 5. Nov 2013
Antwort Antwort
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

DataSnap und der Zugriff auf Datenbanken

  Alt 4. Nov 2013, 18:14
Datenbank: Firebird • Version: 2.5 • Zugriff über: UniDAC
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.
Angehängte Dateien
Dateityp: zip Eigenes_Programm.zip (16,1 KB, 15x aufgerufen)
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.021 Beiträge
 
Delphi 12 Athens
 
#2

AW: DataSnap und der Zugriff auf Datenbanken

  Alt 4. Nov 2013, 23:14
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#3

AW: DataSnap und der Zugriff auf Datenbanken

  Alt 5. Nov 2013, 03:56
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 ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.351 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: DataSnap und der Zugriff auf Datenbanken

  Alt 5. Nov 2013, 06:10
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
arnof

Registriert seit: 25. Apr 2013
1.250 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: DataSnap und der Zugriff auf Datenbanken

  Alt 5. Nov 2013, 07:58
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

Geändert von arnof ( 5. Nov 2013 um 08:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.021 Beiträge
 
Delphi 12 Athens
 
#6

AW: DataSnap und der Zugriff auf Datenbanken

  Alt 5. Nov 2013, 08:25
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe ( 5. Nov 2013 um 08:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#7

AW: DataSnap und der Zugriff auf Datenbanken

  Alt 5. Nov 2013, 21:09
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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:07 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