2009-04-21 11 views
0

J'utilise C# et j'ai trois datatables, tous les trois ont une colonne int nommée idnum, ce dont j'ai besoin est de garder tous les nombres dans la colonne idnum unique dans les trois tables et le prochain numéro sera toujours le petit disponible. Par exemple:Valeurs partagées dans la colonne entre les données dans ado.net

déposer un

IDNUM = 1

IDNUM = 3

IDNUM = 4

tableau b

IDNUM = 2

IDNUM = 7

tableau c

IDNUM = 8

dans ce cas le numéro suivant sur une nouvelle ligne dans l'une des trois tables serait numéro 5 puis 6, puis 9.

Ma question est quelle serait la meilleure approche pour obtenir le prochain numéro? Je ne veux pas utiliser sql.

grâce nuno

Répondre

1

Vous auriez probablement besoin d'un quatrième table, de tenir tous les numéros « lacunes ». Sinon, vous devrez vérifier chaque numéro à partir de 1.

Sur insertion: Trouvez le plus petit nombre dans le tableau des "écarts". Utilisez ce numéro lors de l'insertion d'un nouvel élément. S'il n'y a aucun élément dans la table des espaces, utilisez Max + 1 des idnums dans toutes les tables. Lors de la suppression: placez le numéro que vous venez de retirer dans le tableau des "espaces".

Si votre application est multithread, vous devez ajouter un verrou pour vous assurer que deux threads n'obtiennent pas le même espace.

0

Vous ne serez pas en mesure de le faire automatiquement; Les fonctionnalités de numérotation automatique intégrées dans ADO.NET sont toutes limitées à la table individuelle. Donc, étant donné que vous allez devoir coder votre propre méthode pour gérer cela, quelle est la meilleure façon? Si vous utilisiez une base de données, je vous suggère d'utiliser une quatrième table, de faire de la colonne ID des trois tables principales une clé étrangère dans laquelle vous avez stocké l'ID de la quatrième table et de synchroniser l'insertion d'une ligne dans le quatrième table avec l'insertion d'une rangée dans l'un des trois autres. Quelque chose comme:

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

Mais vous ne voulez pas utiliser une base de données, ce qui me porte à croire que vous ne se soucient pas vraiment de la persistance de ces numéros d'identification.Si elles vraiment besoin d'exister pendant que votre application est en cours d'exécution, vous pouvez simplement utiliser un champ statique pour stocker le dernier ID utilisé, et faire une classe d'aide:

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

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

Le verrouillage est pas strictement nécessaire, mais il y a pas de mal à faire ce code thread-safe.

Ensuite, vous pouvez gérer l'événement TableNewRow sur chacun de vos trois tableaux de données, par exemple:

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

Cela garantira que toute méthode ajoute une nouvelle ligne à chaque table - que ce soit votre code d'appel NewRow() ou nouvelle ligne ajoutée via un contrôle lié aux données - chaque ligne ajoutée aura sa colonne d'identification définie sur l'ID suivant.