2010-12-01 69 views
0

使用ASP.NET,我正在構建一個管理工具,需要一個函數來導入一個電子郵件地址列表。在上傳文件時,我想檢查提供的任何電子郵件地址的現有記錄。對於不存在的電子郵件地址,我會使用我的DAO創建它們。建立一個導入過程,檢查重複項

基本上我想:

  1. 接收電子郵件的列表
  2. 檢索數據對現有的電子郵件
  3. 以dB爲列表中的所有電子郵件創建新的郵件數據
  4. 返回完整數據。

因爲我想知道哪些電子郵件的前存在的時候,我首先想到的是查詢表中的所有記錄WHERE Email IN ('Email001FromFile', 'Email002FromFile', 'etc...')但列表中可能包含數千個電子郵件地址,而我不能肯定該供應IN運營商的許多電子郵件地址將是一個好主意。

我也考慮過循環遍歷列表並檢查每條電子郵件的記錄,但這可能會產生太多的查詢。

我的下一個想法是生成一個臨時表來保存列表並修改IN子句以使用臨時表,而不是明確的項目列表,但這需要我直接執行SQL或存儲過程,由於我使用NHibernate來訪問我的數據庫,所以我不傾向於這麼做。

儘管我使用的是ASP.NET(C#)和NHibernate,並且任何具體的答案都會有幫助,但我只是在尋找關於如何處理這種情況的一般想法。

+0

僅僅因爲你使用的NHibernate不應該讓你使用存儲過程。有時候SP是最好的方法,特別是像這樣的時候,你不希望將所有現有記錄帶入內存。使用正確的工具來完成這項工作,而不僅僅是你現在掌握的工具。 – 2010-12-01 21:03:38

回答

2

如果將現有的電子郵件加載到內存中不是一種選擇,我可能會採取某種批處理方式。請轉到您提及的IN查詢,但只能在n電子郵件中使用。您可以將n代碼硬編碼爲某個值,或者您可以將其作爲新電子郵件總數的函數。

我不確定這種方法是否真的比執行單個IN查詢更快(具有比我更多的db技能的人將不得不回答這個問題),但是這會允許您指示某種加載狀態給用戶。

0

你是否在做任何與重複郵件有關的郵件?

你可以在你的表上放一個UNIQUE約束來只允許一次輸入一個電子郵件地址 - 然後捕獲當你嘗試插入一個副本時SQL會拋出的異常。