Auto-génère un IDENTIFIANT Unique dans le constructeur
À l'aide de VB.net, créer une nouvelle catégorie de personnel, avec les trois propriétés suivantes:
Nom , Nom d'identification devrait être adapté pour une utilisation en tant que clé primaire dans une base de données.
Fournir un constructeur de classe pour remplir les champs Nom et Prénom. L'ID doit être auto-généré à l'intérieur du constructeur et ne doit pas être transmise.
Je sais comment créer une classe, les propriétés et le constructeur, j'ai juste besoin de savoir comment générer automatiquement le champ ID dans le constructeur. Est-il possible de faire cela?
ce que j'ai l'habitude de faire est soit de rendre le champ id dans la base de données en tant que champ d'identité et la clé primaire de sorte qu'il insère automatiquement le prochain id ou Dans mon application j'ai lu le dernier ID de la base de données et ajoutez une. Mais j'ai besoin de savoir comment générer automatiquement le champ ID dans le constructeur.
Il doit être unique dans la DB en question dit qu'il devrait être adapté pour une utilisation en tant que clé primaire dans une base de données.
Dans ce cas, il n'existe aucun moyen pour le constructeur de générer un ID unique sauf comme un GUID, ou quelque chose de similaire. Il n'y a aucun moyen de savoir ce qu'est un auto-incrémentation ID est jusqu'à ce que après il est inséré dans la DB.
Exactement, vous avez raison. Son bon sens, vous avez besoin de lire la base de données pour savoir quel a été le dernier ID inséré.
oui et même dans ce cas (la lecture de DB), vous devez tenir compte de la simultanéité. C'est tout, mais pas une tâche facile à faire correctement (sauf si vous utilisez quelque chose qui est - ou devrait être - unique par lui-même comme un GUID).
OriginalL'auteur Diana | 2014-01-29
Vous devez vous connecter pour publier un commentaire.
Guid
Si vous n'avez pas les contraindre à propos de type ID, vous pouvez utiliser un GUID:
Vous pouvez même le garder comme une chaîne de caractères:
Qui devrait être accordée à l'être unique à travers les différentes machines (pour satisfaire votre exigence qu'il doit être adapté pour une utilisation en tant que clé primaire dans une base de données). Voir aussi ce post.
Timestamp
Qui était pire des cas, si vous n'avez pas une telle exigence stricte (unicité à travers un réseau), vous pouvez utiliser un timestamp. Bien sûr, dans ce cas, vous devez tenir compte de plusieurs questions:
Contre
Si toutes ces conditions sont satisfaites:
Vous pouvez utiliser un
Shared
compteur incrémenté à chaque fois qu'un nouvel objet est construit. Si l'horloge du système granularité n'est pas un problème (voir le paragraphe sur l'horodateur), vous pouvez utiliser système temps comme ID. Avec des limitations sur la granularité il doit travailler avec plusieurs instances de la même application en cours d'exécution simultanément.Si vous utilisez un
Shared
champ que vous avez à traiter avec des problèmes de synchronisation. Comme suggéré dans ce commentaire vous pouvez utiliser unSyncLock
. Comme alternative, vous pouvez utiliser unInterlocked.Increment
opération.Code de hachage
Si tous les condistions pour un compteur sont satisfaits et celui-ci aussi:
ValueType
et il ne modifie pasGetHashCode()
méthode.Vous pouvez utiliser le hash-code (obtenu avec
GetHashCode()
) parce que (à partir de MSDN):Parce que
Object.ReferenceEquals()
retournetrue
que si vous comparez la même instance puis chaque instance possède un unique code de hachage (parce que dans un 32 bits de code de hachage est la référence de l'objet lui-même). Être conscient c'est un détail d'implémentation, et il peut changer.Nombre aléatoire
Je sais que cela peut choquer quelqu'un, mais un bon générateur de nombres aléatoires pour un 64 bits de la valeur a une très faible probabilité de collisions. Je le répète très très faible probabilité (voir cet article pour plus de maths de détails). Il suffit de ne pas utiliser
System.Random
pour cette!Selon laquelle les semences que vous utilisez, vous pourriez être en mesure de générer des nombres aléatoires dans un scénario de réseau trop (ne pas oublier - citation nécessaire - que les versions précédentes pour un réseau local protocole proposé un 32 bits nombre aléatoire que l'adresse, il a été changé à cause de la mauvaise rétroaction des utilisateurs, mais cela ne veut pas dire que ça ne marche pas).
GetHashCode
n'est pas garanti d'être unique. Il est uniquement destiné à être distribué uniformément. À partir de la MSDN: "ne pas utiliser la valeur par défaut de mise en œuvre de cette méthode comme un identificateur d'objet unique"+1, mais une chose de plus... Il est important de mentionner que si vous faites un
Shared
contre, vous auriez besoin de l'envelopper dans unSyncLock
bloc pour le faire thread-safe--si c'est un sujet de préoccupation.OriginalL'auteur Adriano Repetti
Vous voulez un certain nombre qui ne répétez jamais! Alors pourquoi ne pas utiliser cette?
À moins que vos données sont en train de prendre place en millisecondes, cette solution fonctionne très bien. Si vous êtes en cours d'exécution dans un millième de seconde question, puis il suffit d'ajouter un compteur à la fin de la chaîne.
Si vous travaillez sur un réseau, et plusieurs personnes faire la saisie de données, puis ajouter leur id d'employé de la chaîne. Il existe une solution facile pour chaque question, mais dans la plupart, si pas tous les cas, cela fonctionne sans problème.
OriginalL'auteur Thurman Jenner
Générer des ID Utilisateur Unique en fonction de serveur SNTP.
Mes besoins sont un peu différent; mais j'avais besoin de générer de l'aléatoire et de l'ID Utilisateur unique, qui est de 10 numéros, passer du temps juste ne pouvais pas trouver une solution adaptée.
je me suis donc retrouvé avec la fonction suivante; son unique et aléatoire.
Que par une application instantanée sur une machine de test, il est incrémentale de résultat unique; parce que l'utilisateur va générer les dix chiffres une fois sur un non pré-sélective d'horodatage. En plus de jouer avec l'aléatoire alpha préfixe; j'espère que cette fonction peut fournir une solution:
Pour tester la sortie, vous pouvez ajouter:
Je trouve cette solution plus utile que l'interrogation de la table SQL et de lire le dernier id de l'enregistrement et ne incrément.
Notes:
expliquer le scénario dans les détails.
Nom d'utilisateur pour l'application en cours d'exécution sur plusieurs postes de travail.
Exemples de sortie:
OriginalL'auteur wpcoder