Einzelnen Beitrag anzeigen

Peter Geyer

Registriert seit: 25. Jun 2004
7 Beiträge
 
#1

Mehrbenutzerzugriff mit ADO und MSSQL

  Alt 25. Jun 2004, 12:11
Hallo,

ich soll in unserer Firma ein kleines Verwaltungsprog schreiben das Multiuser fähig ist.
Eigentlich dachte ich, das das nicht soo schwer sein kann, aber weit gefehlt. Ich komme seit einer Woche irgendwie nicht weiter.
Entweder ist es so einfach, das niemand drüber spricht, oder ich bin zu doof
Ich habe halb Google auswendig gelernt, aber irgendwie war nicht das richtige dabei.
Ich hoffe bei Euch gibt es Leute die sowas schonmal gemacht haben.

Also, ich schreibe erstmal was ich bereits verwende und was ich schon alles Versucht habe.

Ich möchte per Delphi ADO Komponenten auf einen MSSQL2000 Server zugreifen.
Dazu verwende ich TADOConnection und TADOQuerry.
Ich habe schon oft gelesen man solle die BetterADO verwenden, allerdings ist der Download nicht zu erreichen.
Es sollte ja auch mit den eigenen Komponenten klappen.

Ich habe folgendes bereits gemacht:
Der user sieht ein DBGrid dessen Inhalt über ein Querry gefüllt wird. Nun soll man einen Datensatz doppelklicken und ein
Detailfenster erscheint wo nun die Änderungen gemacht werden können. Mit OK wird das Fenster geschlossen und die Daten geschrieben. Die Prozedur mit der ich die Daten schreiben sieht folgendermaßen aus:

Delphi-Quellcode:
procedure Datenupdaten;
begin
  
  Form1.ADOConnection1.BeginTrans;
  try
  With Form1.Artikel do
    Begin
    SQL.Text:='UPDATE Artikel SET
ArtNr=:_ArtNr,
ArtName=:_ArtName
WHERE ID=:_ID
';

    Prepared := True;
    With Parameters Do
    Begin
      ParamByName('_ArtNr).Value := Form_Arikel.Edit1.Text
ParamByName(
'_ArtName).Value := Form_Artikel.Edit2.Text;
    End;
    Form1.QKunde.ExecSQL;
    end;
    Form1.ADOConnection1.CommitTrans;
  except
    on E: Exception do Form1.ADOConnection1.RollbackTrans;
  end;
  Form_Arikel.Close;
end;
Das ganze klappt ja eigentlich schon ganz gut nur bekomme ich das Problem nicht in den Griff, das
zwei User die Detailmaske eines Artikels aufmachen,
-User1 Kaffee trinken geht
-User2 etwas ändert und speichert
-User1 zurückkommt und seine eigenen Änderungen speichert bzw. einfach nur OK drückt und die alten daten zurückschreibt.
Damit sind dann die Änderungen von 2 einfach weg.

Es ist übrigens ausdrücklich gewünscht, das alle User den selben Datensatz lesen können, aber nur der "erste" ihn auch ändern und speichern kann. Die anderen sollen halt dann nur "schnell was nachschauen" dürfen. Ich hoffe Ihr wisst was ich meine.

Überall im Netz finde ich Bruchstückhafte Anweisungen wie das zu lösen sei. Konkrete Codeschnipsel sind allerdings immer Fehlanzeige. Auch die OH von delphi und MSSQL geben nur wenig Aufschluß.

Die Möglichkeit der Sperrtabelle finde ich recht unelegant, da muss der Zeitstempel ein Verfallsdatum haben damit nach einem Absturz der Datensatz nicht ewig gesperrt bleibt und so weiter...

Ich habe auch schon etwas von SELECT ... FOR UPDATE gelesen, nur scheint das nur mit MySQL zu laufen.
Bei MSSQL gibt es einen Fehler der besagt das es nur in Verbindung mit CURSOR möglich sei. - Hmmpf.

An anderer Stelle wurde gesagt das das innerhalb der UPDATE Klausel geht, etwa so:
SQL-Code:
UPDATE Tabelle
SET SpalteA = 1,
       SpalteB = 2
WHERE SpalteA = 'Alte Daten von A
AND SpalteB = 'Alte Daten von B'
So würde nur ein Update geschehen wenn sich die Daten in der Zwischenzeit nicht geändert hätten, und eine Exeption ausgelöst sofern die Daten nicht eingefügt wurden. Ich weiss nur nicht wie das gehen soll

Ich bin total verzweifelt, weil ich nirgendwo mal ein echtes stückchen Code, oder Anleitung finden konnte, die ich hätte adaptieren können.

Bin ich denn der einzige Mensch der dieses Problem hat? Es gibt doch tausende von Multiuser Anwendungen die genau so funktionieren.

Ich würde mich riesig freuen, wenn jemand mir da weiterhelfen könnte. Oder mir auch sagen, das ich so wie ich das vorhabe, auf dem Holzweg bin.

Wenn keiner ein Stück Code hat, gibt es vieleicht gute Bücher die das Problem konkret beschreiben? Ich habe hier schon einen Stapel, aber die sprechen mit Vorliebe über Interbase...

Bitte, bitte, bitte, ich brauche eine


in diesem Sinne

grüße Peter


*schleim*
Ich habe keine Ahnung, deshalb frag´ ich ja
  Mit Zitat antworten Zitat