Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Zwei Anwendungen, eine Datenbank - Synchronisieren??? (https://www.delphipraxis.net/40299-zwei-anwendungen-eine-datenbank-synchronisieren.html)

romber 13. Feb 2005 23:27

Datenbank: Microsoft SQL Server • Version: 2000 • Zugriff über: ADOTable + DataSet

Zwei Anwendungen, eine Datenbank - Synchronisieren???
 
Hallo!

Ich habe zwei verschiedene Programmchen, die mithilfe ADO mit einer und deselben Microsoft SQL Server 2000-Datenbank verbunden sind. Eine Anwendung benutzt die Datenbank für die Login-Funktion. Diese hat auch einen mit der ADOTable verbundenen DBGrid. Das zweite Programm läuft auf einem entfernten PC und dient als Userverwaltung. Damit gebe ich in die Datenbank neue User ein, die sich nacher in die erste Programm einloggen müssen. Das Problem ist: wenn ich neue User-Konten über die Verwaltungsprogramm eingebe, werden diese nicht sofort für Login-Programm erreichbar. Ich muss entweder das Programm neustarten oder Activ-Eigenschaft der ADOTable zuerst auf False und dann wieder auf True setzen, erst dann werden die Daten im aktualisiert. Kann man irgendwie so machen, dass über eine Programm in die SQL-Datenbank eingegebene Daten sofort für das andere Programm, das den gleichen Datenbank nutzt, erreichbar sind?

Natürlich kann man das mit einem Timer lösen, der mit den regelmäßigen Abständen die ADOTable deaktiviert und sofort wieder aktiviert. Ist diese primitive und unsichere Methode den einzige Lösung für mein Problem? Denke ich nicht.

Danke!

MfG,
Ralf

jensw_2000 14. Feb 2005 00:47

Re: Zwei Anwendungen, eine Datenbank - Synchronisieren???
 
Schreibe dir doch eine Stored Procedure, der du als Parameter den Benutzernamen übergibst und gleichzeitig über einen OUTPUT-Parameter das Passwort aus der DB holst ...

Das hat folgende Vorteile ...
- dein Problem mit dem Refresh löst sich in Luft auf
- die durch ADO gefetchte Datenmenge ist extrem klein (und somit schnell)
- du kannst tausende User Anlegen ohne das die "Abfrage" spührbar langsamer wird
- du sparst Locate bzw. Lookup in deiner ADOTable ... spart noch mal Zeit ...


[EDIT]
Kleines Beispiel

SQL SERVER ...

SQL-Code:
CREATE PROCEDURE GetPasswd
  @Username varchar(20),     -- Input Parameter, muss durch dein Prog übergeben werden
  @Passwd OUTPUT varchar(20) -- da landet dein Passwort drin. Den Parameter kannst du mit Delphi auswerten
AS
  -- Benutzertabelle abfragen und Variable @Passwd füllen
  SELECT @Passwd = EncryptedPasswd
  FROM Benutzertabelle
  WHERE UPPER(FELD_Benutzername) = UPPER(@Username)

RETURN
GO
In Delphi ...

Delphi-Quellcode:
function Login(Username,Password:String):boolean;
var SP: TAdoStoredProc;
    pw:Variant;
begin
// ungetestet
// gibt true zurück wenn User und DB übereinstimmen

  Result:=False;

  // TADOStoredProc zur Laufzeit erstellen
  SP := TAdoStoredProc.Create(nil);

  try
    // SP mit deiner TADOConnection verbinden
    SP.Connection := deine_Adoconnection;

    // SP mit der Stored Procedure 'GetPasswd' verbinden
    SP.ProcedureName := 'GetPasswd';

    // Parameterlisten holen
    SP.Parameters.Refresh;

    // Input Parameter 'Username' füllen
    SP.Parameters[1].Value := Username;

    // SP ausführen und offen halten (nicht SP.Execute, da du den Output Parameter noch abfragen musst ...
    SP.Open;

    // Output Parameter aus SP lesen
    pw:=SP.Parameters[2].Value;
   
    // SP Schließen
    SP.CLose
  finally
    // SP freigeben
    FreeAndNil(SP);
  end;
 
  // Wenn der Benutzer nicht in der DB gefunden wurde ist der Output Parameter der SP = NULL
  if vartype(pw) = vtNULL then
  begin
    result:=false;
    Showmessage('Hi, dich kenne ich nicht... '+#13#10+
                'Wenn du neu bist melde dich bitte beim Admin !'+#13#10+ 
                'Falls du dich vertippt hast, versuche es noch einmal.');
    exit;
  end;

  // vergleichen ob das Passwort aus der DB mit Password übereinstimmt ...
  Result:= ((Decrypt(PW)=Password);

end;
[/EDIT]

:hi:
Schöne Grüße,
Jens

Jelly 14. Feb 2005 01:23

Re: Zwei Anwendungen, eine Datenbank - Synchronisieren???
 
@romber:

Was du in deinem Titel mit Synchronisieren benennst, ist in der Datenbankbranche was anderes. Damit ist das Synchronisieren von 2 gleichen Datenbanken mit unterschiedlichen Datenbeständen gemeint. Auch unter Replikation bekannt. Sowas kann der MSSQL Server von Haus aus... Aber das ist ja nicht dein Problem gewesen.

Wenn ich dich richtig versteh, verwaltest du deine Userkonten über eine eigens angelegte Tabelle. Das macht bei so einem mächtigen DBMS wie MSSQL keinen Sinn. Warum nutzt du nicht die interne Userverwaltung. Dann bist du auch sicherheitstechnisch auf der sicheren Seite. Aber damit ist dein Problem immer noch nicht gelöst... 2 unterschiedliche Rechner kriegen nix voneinander mit. Will heissen, wenn Rechner A einen neuen Datensatz einfügt, so kriegt das Rechner B nicht mit. Erst nach einer neuen Query klappt das. Das ist so in allen mir bekannten DBMS. MSSQL (und alle anderen Systeme auch) bietet dir nur die Sicherheit, daß nicht 2 Rechner parallel an einem Datensatz was rumfuschen.

romber 14. Feb 2005 02:03

Re: Zwei Anwendungen, eine Datenbank - Synchronisieren???
 
Danke! Werde es ausprobieren!


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