2 Stimmen

Wie kann ich eine eindeutige ID im Offline-Modus bereitstellen?

Wenn ein Benutzer in einer Client-Server-Buchhaltungsanwendung in Rechnungsform eine Rechnung speichert, erhält er vom Server eine Rechnungsnummer wie 90134 und speichert die Rechnung mit dieser Nummer.
Die Rechnungsnummer wird für den Kunden benötigt.
Wie kann man also im Offline-Modus (z. B. wenn das Netzwerk unterbrochen ist) eine eindeutige ID bereitstellen?

Ist es sinnvoll, String Id nach folgendem Muster zu verwenden: Client + inkrementelle Nummer?

Ich möchte nicht GUID s.

3voto

ZombieSheep Punkte 29085

Wenn Sie im Voraus wissen, wie viele Rechnungsnummern Sie pro Kunde während einer Offline-Periode generieren werden, könnten Sie dann Rechnungsnummern im Voraus zuweisen? z.B. wenn jeder Kunde wahrscheinlich nur 4 Rechnungen pro Offline-Periode generieren wird, könnten Sie jedem Kunden einen Block von 4 Nummern zuweisen. Dazu könnte eine zusätzliche Spalte in Ihrer DB erforderlich sein, um einen Wert zu speichern, der angibt, ob es sich bei der Nummer um eine bereits erstellte Rechnung oder um eine Vorabzuweisung einer Nummer handelt. Je nach der Struktur und den Beschränkungen Ihrer DB müssen Sie möglicherweise auch einige Dummy-Daten speichern, um die referenzielle Integrität zu gewährleisten.

Der Nachteil wäre, dass Ihr Nummernblock möglicherweise nicht der Reihe nach oder überhaupt nicht verwendet wird, so dass Ihre Rechnungsnummern nicht in chronologischer Reihenfolge sind. Außerdem würden Sie Probleme bekommen, wenn der Pool der verfügbaren Nummern aufgebraucht ist.

2voto

TcKs Punkte 24671

Sie können Guid verwenden:

var myUniqueID = Guid.NewID();

In SQL Server ist der entsprechende Typ uniqueidentifier .

Im Allgemeinen ist die Guid eine 128-Bit-Zahl.

Mehr über Guid können Sie lesen:

http://en.wikipedia.org/wiki/Globally_unique_identifier

http://msdn.microsoft.com/en-us/library/system.guid.aspx

2voto

M0-3E Punkte 932

Ich nehme an, dass die Rechnungsnummer (Integer) inkrementell ist: in diesem Fall, da Sie keine Möglichkeit haben, die letzte Rechnungsnummer zu kennen, könnten Sie die Rechnung in einer lokalen Datenbank/Cache/xml ohne die Rechnungsnummer speichern und auf die Netzwerkverbindung warten, um die neuen Datensätze in die Datenbank einzufügen (die Rechnungsnummer würde dann generiert werden)

1voto

Simon Woker Punkte 4914

Sie könnten Ihre Zahlen für jeden Kunden in einem anderen Bereich beginnen... z.B.:

  • Kunde 1: 1.000.000
  • Kunde 2: 2.000.000
  • Kunde 3: 3.000.000

Aktualisieren Sie sie von Zeit zu Zeit, wenn es ist eine Verbindung, um Überschneidungen zu vermeiden.
Das ist zwar nicht 100 % kugelsicher, aber immerhin besser als nichts.

Mein Favorit wäre immer noch ein GUID da sie immer einzigartig sind.

0voto

M0-3E Punkte 932

Es gibt einen Workaround, aber es ist nur ein "schmutziger Hack". Sie sollten ernsthaft überdenken, ob Sie neue Dateneinträge akzeptieren, wenn Sie offline sind, insbesondere wenn es um eindeutige IDs geht, die in viele Tabellen eingefügt werden sollen.

Angenommen, Sie haben eine Tabelle "Bestellungen" und eine weitere Tabelle "orderDetails" in Ihrem lokalen Dataset:

1- Fügen Sie eine tmpID vom Typ integer in Ihre Tabelle "orders" ein, um jede einzelne Bestellung vorübergehend zu identifizieren.

2- verwenden Sie die tmpID Ihrer neu erstellten Bestellung im weiteren Prozess (z.B. für das Hinzufügen von Produkten zur aktuellen Bestellung in der Tabelle orderDetails)

--> Sobald Sie mit dem Server verbunden sind, führen Sie in einer einzigen Transaktion Folgendes aus

1- fügen Sie den ersten Auftrag in die Tabelle "Aufträge" ein

2- seine eindeutige ID auf Ihrem SQL-Server generieren lassen

3- Suchen Sie nach jeder Zeile in "orderDetails", die eine tmpID von currentOrder.tmpID hat, und fügen Sie sie in die Tabelle "orderDetails" auf Ihrem Server ein

4 - Bestätigen Sie die Transaktion und fahren Sie mit der nächsten Zeile fort.

Denken Sie daran, dass dies eine sehr schlechte Kodierung ist, die sehr schmutzig werden kann und schwer zu pflegen ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X