2010-12-01 9 views
0

En utilisant ASP.NET, je construis un outil d'administration qui nécessite une fonction pour importer une liste d'adresses email. Lors du téléchargement du fichier, je veux vérifier les enregistrements existants pour l'une des adresses e-mail fournies. Pour les adresses e-mail non existantes, je les créer en utilisant mon DAO.Création d'un processus d'importation qui vérifie les doublons

Fondamentalement je veux:

  1. liste de réception des e-mails
  2. extraient des données des e-mails existants
  3. Créer des données pour les nouveaux e-mails dans db
  4. retour des données complètes pour tous les e-mails dans la liste.

Depuis que je veux savoir lequel des e-mails existent avant, ma première pensée était d'interroger la table pour tous les enregistrements WHERE Email IN ('Email001FromFile', 'Email002FromFile', 'etc...') mais la liste pourrait potentiellement contenir des milliers d'adresses e-mail, et je ne suis pas certain assurer l'approvisionnement De nombreuses adresses e-mail à l'opérateur IN seraient une bonne idée. Je pensais aussi à faire une boucle dans la liste et à chercher un enregistrement pour chaque email, mais cela génèrerait potentiellement beaucoup trop de requêtes. Mon idée suivante était de générer une table temporaire pour contenir la liste et modifier la clause IN pour utiliser la table temporaire plutôt qu'une liste explicite d'éléments, mais cela nécessiterait l'exécution directe de SQL ou d'une procédure stockée, Je ne suis pas enclin à le faire puisque j'utilise NHibernate pour accéder à ma base de données. Bien que j'utilise ASP.NET (C#) et NHibernate, et toutes les réponses spécifiques à ce sujet seraient utiles, je suis vraiment à la recherche d'idées générales sur la façon de gérer ce scénario.

+0

Tout simplement parce que vous utilisez NHibernate ne devriez pas vous décourager en utilisant des procédures stockées. Il y a des moments où un SP est la meilleure approche, en particulier des moments comme celui-ci où le problème est que vous ne voulez pas avoir à mettre tous les enregistrements existants en mémoire. Utilisez le bon outil pour le travail, pas seulement l'outil que vous avez en main pour le moment. –

+0

Cela ne prendrait-il pas trop de temps en une transaction avec tous les types d'outils que vous pouvez utiliser? Je suppose que vous devez de toute façon lot avec beaucoup d'enregistrements à importer. – Paco

Répondre

2

Si le chargement des e-mails existants en mémoire n'est pas une option, je ferais peut-être une sorte d'approche par lots. Optez pour la requête IN que vous mentionnez, mais faites-le uniquement pour les e-mails n à la fois. Vous pouvez attribuer un code de sécurité n à une certaine valeur ou vous pouvez le laisser varier en fonction du nombre total de nouveaux e-mails. Je ne suis pas sûr si cette approche est vraiment plus rapide que d'effectuer une seule requête IN (quelqu'un avec plus de compétences DB que moi aurait à répondre à cela), mais cela vous permettrait d'indiquer une sorte de chargement statut à l'utilisateur.

0

Est-ce que vous faites quelque chose avec les emails qui sont en double?

Vous pouvez mettre une contrainte UNIQUE sur votre table pour autoriser uniquement l'entrée d'une adresse e-mail une seule fois - puis attraper l'exception que SQL lancera lorsque vous tenterez d'insérer un doublon.