Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Server <-> MSDE 2000 - Synchronisation anstoßen (https://www.delphipraxis.net/76070-sql-server-msde-2000-synchronisation-anstossen.html)

Haueha 29. Aug 2006 13:58

Datenbank: SQL Server / MSDE • Version: 2000 • Zugriff über: ADO / ADOX

SQL Server <-> MSDE 2000 - Synchronisation anstoßen
 
Hallo Forum,

Ich habe ein Programm entwickelt mit Delphi 7. Das Programm soll mobile Mitarbeiter unterstützen.
Um zwei Datenbanken (Orginal und Replik) zu synchronisieren (SQL Server im zentralen Office / MSDE 2000 auf z.B. Laptop für unterwegs), habe ich folgende Konstellation aufgebaut.

Auf einer Maschine laufen zwei Instanzen der MSDE 2000 Version A. Die erste Instanz ist Verleger und gleichzeitig Verteiler, die zweite Instanz ist folglich Abonnent. Auf der ersten ("zentralen") Instanz habe ich dann die Merge-Replikation mit Push auf die zweite ("mobile") Instanz eingerichtet. Wunderbar: Die Synchronisation läuft, eingestellt auf alle 10 Minuten. Später wird der Merge-Agent für das Synchronisieren sicherlich nur alle 2-3 Std. laufen, ggf. wird sogar sogar nur bei Bedarf synchronisiert.

Nun werden sich die mobilen Mitarbeiter mit ihrem Laptop ans Firmennetz hängen und ihre Änderungen sofort synchronisieren wollen. Dazu werden sie sich aus dem Programm heraus mit dem zentralen Datenbanksystem verbinden (erste Instanz mit dem Merge-Agenten) und einen Menüpunkt -> Synchronisieren <- ausführen, der letztendlich den Merge-Agenten anstößt.

Wie kann ich aus dem Programm heraus die Synchronisation erzwingen? Ich habe keine Ahnung, wie dies programmseitig entwickelt werden kann/muß. Denkbar wäre auch, das man aus dem Programm eine Batch Datei ausführt, welche dann den Merge-Agenten startet.

Vielleicht ist auch das Konzept, mobile Mitarbeiter mit einer MSDE auszustatten, nicht das richtige.
Irgendwelche Ideen.

---------------------------------

Für Access habe ich sowas auch gebastelt und es funktioniert so, wie ich es mir vorgestellt habe.
Dazu habe ich die Typen Bibliothek JRO installiert (Microsoft Jet and Replication Objects 2.X). Damit standen folgende Klassen zur Verfügung : TReplica / TJetEngine. Leider funktioniert das, soweit ich weiss, nur mit MS Access.

Im Code dann wie folgt:

Delphi-Quellcode:
function AccessDB_ReplikSyncronisieren(ConnectObj:_Connection;RDBfadundName:string) : boolean;
var
  FReplica : Replica;
begin
  FReplica:= CoReplica.Create;
  try
    FReplica._Set_ActiveConnection(ConnectObj);
    FReplica.Synchronize(RDBfadundName,jrSyncTypeImpExp,jrSyncModeDirect);
    result:=true;
  except
    result:=false;
  end;
end;
Hier der Aufruf der Methode:

Delphi-Quellcode:
if AccessDB_ReplikSyncronisieren(FormMain.ADOConnection1.ConnectionObject,RPfadundName) then begin
      Memo1.Lines.Add('Starte Synchronisation ... fertig.');
end else ....

Danke
Andreas

shmia 29. Aug 2006 14:52

Re: SQL Server <-> MSDE 2000 - Synchronisation anstoße
 
Deine Aufgabe lässt sich über MSDN-Library durchsuchenSQLDMO erledigen.
Dazu im Delphi-Menü:
Projekt->Typbibliothek installieren... und "Microsoft SQLDMO Object Library" auswählen und
Unit anlegen klicken.

Du wirst nun von der Anzahl der Interfaces fast erschlagen (100 oder mehr ?).
Welches Interface du wie ansteuern musst, kann dir am ehesten in einem MS Forum erklärt werden.
Über SQLDMO hast du die Kontrolle über alles was mit dem SQL Server zu tun hat; es ist nur etwas viel für den Anfang.
http://support.microsoft.com/kb/324992/

PS:
Alternativ müsste es auch möglich sein, diese Synchronisation über eine schon vorhandene Stored Procedure anzustossen.
Schau mal in der Hilfedatei nach "sp_resyncmergesubscription" (das hört sich schon mal interessant an)

Haueha 30. Aug 2006 16:13

Re: SQL Server <-> MSDE 2000 - Synchronisation anstoße
 
Hallo shmia,

vielen Dank für deine schnelle Hilfe. Habe mich mit deinen Tipps einen Augenblick beschäftigt.

Zitat:

Zitat von shmia
Deine Aufgabe lässt sich über MSDN-Library durchsuchenSQLDMO erledigen.
Dazu im Delphi-Menü:
Projekt->Typbibliothek installieren... und "Microsoft SQLDMO Object Library" auswählen und
Unit anlegen klicken.

Du wirst nun von der Anzahl der Interfaces fast erschlagen (100 oder mehr ?).
Welches Interface du wie ansteuern musst, kann dir am ehesten in einem MS Forum erklärt werden.
Über SQLDMO hast du die Kontrolle über alles was mit dem SQL Server zu tun hat; es ist nur etwas viel für den Anfang.
http://support.microsoft.com/kb/324992/

Hier mußte ich diverse Klassen erstmal neu benamslen, da Klassen wie "TApplication" natürlich schon bekannt waren. Und das dann eben Xmal. Dann gabs beim kompilieren noch ein paar Fehler. Anschließend stand ich vor dem Problem, welche der Komponenten es denn nun tun könnte, wie du schon vermutest hast.

Um es kurz zu machen, ich habe die Synchronisationsfunktion von XP genutzt, zu finden unter Start / Alle Programme / Zubehör / Synchronisieren. Das, was ich aus meinen Programm machen wollte, kann ich auch übers Betriebssystem steuern. Keep it simple ...

Es läuft nun wie folgt:
1). Delphi Programm starten
2). "Mandanten" auswählen, also die SQL DB, mit der man verbunden sein will (Zentral = SQL Server = Netzwerk oder Mobil = MSDE = lokal)
3). Will man synchronisieren, dann über Start / Alle Programme / ..... / Synchronisieren. Fertig

Läuft einwandfrei und ist super simple. Damit hat man auch die drohende Vielzahl von Sychronisations Jobs (der Merge Push Agenten) vom SQLServer genommen. Die Richtung ist quasi umgedreht, also vom Client initiiert. Die Merge Pull Agenten laufen lokal auf der jeweiligen MSDE. Macht auch deshalb Sinn, weil man für Merge Push Agenten nicht die Option "on demand" einstellen kann, sondern diese nur zeitgesteuert/ereignisgesteuert laufen. Ich wollte ja nur dann synchronisieren, wenn der Mitarbeiter mit seinen Laptop am Netz hängt und es explizit ausführt.

Gruß, Andreas


Alle Zeitangaben in WEZ +1. Es ist jetzt 18: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