Einzelnen Beitrag anzeigen

etom291272

Registriert seit: 16. Feb 2004
Ort: ---
232 Beiträge
 
#1

Mehr Benutzer Primary Key Insert in Tabelle

  Alt 15. Feb 2005, 13:08
Datenbank: MSSQL SRV • Zugriff über: ADO
Hallo DP ler

Ich würde mich über eine Einschätzung von euch zu folgendem Problem und meinen Lösungsweg freuen.

Problem:
Ich entwickle zur Zeit ein Dokumentenmanagementsystem dass eng mit unserer ERP Lösung zusammenarbeitet. Die Haupttabelle für dieses Projekt ist eine Tabelle wo jedes Dokument einmalig gespeichert ist. Durch folgende Vorgänge können neue Sätze in diese Tabelle erstellt werden.
1. Aus dem ERP System beim Druck diverser Belegarten
2. Über einen Dokumentencsanner der von meinem Programm angesprochen wird.
3. Von bis zu 100 Usern im Netzwerk durch diverse Ablagemöglichkeiten im Programm.

Ich halte es für nicht ausgeschlossen dass in dieser Konstellation es vorkommen kann dass zwei oder mehr Inserts zusammenstossen (Ich verwende einen Primary Key in dieser Tabelle für das ID Feld).

folgenden Code habe ich mir für die Lösung dieses Problems überlegt

Delphi-Quellcode:
 while i < 50 do //50 gleichzeitige Zugriffe simulieren
  begin
    i:=i+1;
    MaxInsVersuche:=0; olev:=0;
    while (MaxInsVersuche < 5) and (olev = 0) do // Verhinderung Endlosschleife falls
                                                  // Exception durch anderen Grund ausgelöst
    begin
      Inc(MaxInsVersuche,1);
      aNextDokId:=DataMain.NeueDokId; // Holt nächste höhere Nummer (DokID) aus Datenbank
      try
        sSql := Format('INSERT INTO dokumente (dkDokumentId, dkDokGruppe, dkErstelltAm, dkBezeichnung) VALUES (%s , %s, %s, %s)',
                      [IntToStr(aNextDokId),'99',QuotedStr(DateToStr(now)),QuotedStr('Bezeichnung')]);
        DataMain.AdoConMain.ConnectionObject.Execute(sSql,olev,0);
      except
        Sleep(1000) //Annahme Exception ausgelöst durch Verletzung Primary Key
                   // warten bis anderer User Insert abgeschlossen hat
      end;
    Memo1.Lines.Add(inttostr(aNextDokId)+'@'+IntToStr(MaxInsVersuche));
    end;
    if olev<>1 then Application.MessageBox('Insert nicht erfolgreich','Fehler',16)
  end;

  ShowMessage('Instert Ok');
Ich habe diesen Programmteil von 2 Pc's absolut gleichzeitig gestartet und es funktioniert imho zielführend.

Anmerkung: Ich kann keinen Autowert oder GUID für den eindeutigen Schlüssel verwenden.
  Mit Zitat antworten Zitat