2009-04-21 8 views
0

Ich benutze C# und ich habe drei Databases, alle drei haben eine int-Spalte mit dem Namen idnum, was ich brauche ist, alle Zahlen in der Spalte Idnum in den drei Tabellen eindeutig zu halten und die nächste Nummer wird immer die kleine verfügbare sein. Zum Beispiel:Gemeinsame Werte in der Spalte zwischen den Daten in ado.net

Tabelle

IDNUM = 1

IDNUM = 3

IDNUM = 4

Tabelle B

IDNUM = 2

a =

IDNUM 7

Tabelle C

IDNUM = 8

in diesem Fall wird die nächste Nummer in einer neuen Zeile in einen der drei Tabellen würde Nummer 5 dann 6 und dann 9 sein.

Meine Frage ist, was wäre der beste Ansatz, um die nächste Nummer zu bekommen? Ich möchte nicht sql verwenden.

dank nuno

Antwort

1

Sie würden wahrscheinlich eine vierte Tabelle wollen, alle „Lücke“ Zahlen zu halten. Sonst müssten Sie jede Nummer ab 1 prüfen.

Bei der Einfügung: Suchen Sie die kleinste Nummer in der Tabelle "Lücken". Verwenden Sie diese Nummer beim Einfügen eines neuen Artikels. Wenn in der Lückestabelle keine Elemente vorhanden sind, verwenden Sie Max + 1 der ID-Nummern für alle Tabellen.

Ein löschen: Geben Sie die Nummer, die Sie gerade zurückgezogen haben, in die Tabelle "Lücken" ein.

Wenn Ihre App multi-threaded ist, müssen Sie eine Sperre hinzufügen, um sicherzustellen, dass zwei Threads nicht dieselbe Lücke einnehmen.

0

Sie werden das nicht automatisch machen können; Die automatischen Nummerierungsfunktionen, die in ADO.NET integriert sind, sind auf die einzelne Tabelle beschränkt.

Also, vorausgesetzt, dass Sie Ihre eigene Methode, um damit umgehen zu müssen, was ist der beste Weg?

Wenn Sie eine Datenbank verwenden, würde ich vorschlagen, dass Sie eine vierte Tabelle verwenden, die ID-Spalte in den drei Haupttabellen einen Fremdschlüssel machen, in dem Sie die ID der vierten Tabelle gespeichert haben, und das Einfügen einer Zeile synchronisieren vierte Tabelle mit Einfügen einer Zeile in eine der anderen drei. Etwas wie:

INSERT INTO Sequence (DateInserted) VALUES (GETDATE()) 
INSERT INTO TableA (SequenceID, ...) VALUES (@@SCOPE_IDENTITY(), ...) 

Aber Sie wollen nicht, um eine Datenbank verwenden, die mir zeigt, dass Sie wirklich über die Persistenz dieser ID-Nummern nicht kümmern.Wenn sie wirklich brauchen nur zu existieren, während die Anwendung ausgeführt wird, können Sie nur ein statisches Feld verwenden, um die zuletzt verwendete ID zu speichern, und eine Hilfsklasse machen:

public static class SequenceHelper 
{ 
    private static int ID; 
    private static object LockObject = new object(); 

    public static int GetNextID() 
    { 
     lock (LockObject) 
     { 
     return ID++; 
     } 
    } 
} 

Die Verriegelung nicht unbedingt notwendig ist, aber es gibt Es schadet nicht, diesen Code threadsicher zu machen.

Dann können Sie das TableNewRow Ereignis auf jeder der drei Datentabellen, zB handhaben:

DataTable t = MyDataSet["TableA"]; 
t.TableNewRow += new delegate(object sender, DataTableNewRowEventArgs e) 
    { 
     r.Row["ID"] = SequenceHelper.GetNextID(); 
    }; 

Dies wird, dass versichern Welches Verfahren auch immer zu jeder Tabelle eine neue Zeile hinzufügt - ob Ihr Code ist NewRow() oder ein Aufruf Neue Zeile wird über ein datengebundenes Steuerelement hinzugefügt - für jede hinzugefügte Zeile wird die ID-Spalte auf die nächste ID gesetzt.

Verwandte Themen