2014-10-31 33 views
0

我正在開發一個asp.net應用程序。用戶可以上傳一個csv文件,每行由3個字段組成,姓氏,年齡。我也有一個oracle數據庫,我有一個由名字,姓氏,年齡,國家組成的表格。在csv的每一行,我必須在我的表格中檢查姓名是否在我的表格中註冊。所以它在性能方面非常昂貴。由於我的表只是每晚更新,我正在考慮在.net集合中像列表一樣複製我的oracle表的姓氏。所以我會在每個csv行檢查這些字段是否在我的列表中,而不是必須執行一個sql請求,我會做一個select count。所以我有2個問題: 這是在.net集合中複製我的表的解決方案似乎很好嗎? 如果是的話,你能解釋一下如何在.net集合中複製oracle表的內容嗎?將.net集合中的表的特定列複製爲列表

在此先感謝

回答

0

我認爲最有效的方式做到這將是創建一個通用模型類存儲每個用戶。像這樣...

public class User 
{ 
    public string Name { get; set; } 
    public string Surname { get; set; } 
    public int Age { get; set; } 
    public string Country { get; set; } 

    // This comparer will be used to find records that exist or don't exist. 
    public class KeyFieldComparer : IEqualityComparer<User> 
    { 
     public bool Equals(User u1, User u2) 
     { 
      return u1.Name == u2.Name && u1.Surname == u2.Surname; 
     } 

     public int GetHashCode(User u) 
     { 
      return u.Name.GetHashCode()^u.Surname.GetHashCode(); 
     } 
    } 
} 

現在加載兩個CSV文件和Oracle表爲List<User>對象......

List<User> csvList; 
List<User> oracleList; 

當兩個列表中含有數據,這將是很容易看到已經什麼存在於每個而不是命中數據庫...

// This will filter users that are in the CSV file that don't already exist in oracle. 
var newUsers = csvList.Except(oracleList, new User.KeyFieldComparer()); 

然後,您可以遍歷每個新用戶並插入...

foreach (var newUser in newUsers) 
    InsertNewUser(newUser); 

希望這是有幫助的。


UPDATE:
我最喜歡的方式是使用微ORM從數據庫加載到數據的列表,如Insight.Database。只需在nuget中搜索Insight.Database並安裝Insight.Database.Providers.Oracle。然後,您可以查詢該表到這樣的記憶......

List<User> oracleList; 
using (var db = new OracleConnection(ConnectionString)) 
{ 
    oracleList = db.QuerySql<User>("SELECT Name, Surname, Age, Country FROM Users"); 
} 

只要在你的類模型的屬性相匹配,你選擇的列的名稱,它將正確映射它們(它不區分大小寫)。

+0

好的謝謝,我對一個仍然不清楚的部分提出了一些問題。我如何繼續在我的數據庫中填充用戶表的列名和姓氏的oraclelist,在性能方面效率最高,成本最低。 – user2443476 2014-10-31 16:01:13

+0

當我嘗試使用Query方法時,我收到了這個錯誤:'Oracle.DataAccess.Client.OracleConnection'不包含'Query'的定義,也沒有包含接受'Oracle.DataAccess'類型的第一個參數的擴展方法'Query' .Client.OracleConnection「可以找到(你是否缺少使用指令或程序集引用?) – user2443476 2014-11-03 09:16:45

+0

右鍵單擊解決方案資源管理器中的項目。點擊管理nuget包。確保在線 - > nuget.org在左側選擇。在搜索中輸入「insight.database」。在搜索結果中選擇Insight.Database.Providers.Oracle,然後單擊安裝。這應該添加必要的擴展方法。參考:https://github.com/jonwagner/Insight.Database/wiki/A-Quick-Tour – Theo 2014-11-03 15:25:32

0

事實上,您最好的選擇是將所有這些留給Oracle。所以..

首先

  1. 用的(姓名,年齡)的結構,你的數據庫創建一個臨時表。

然後

  1. 裝入CSV臨時表。
  2. 從您的臨時表中選擇數據加入針對您的目標表。
  3. 將其餘部分(將CSV數據行不存在於目標數據庫表中)加載到目標數據庫表中。

在那裏,一切都完成了。說實話,在.NET方面你不可能比Oracle更快地做到這一點。

步驟2 + 3將是:

insert into target_table (name, surname, age) 
select X.name, X.surname, X.age 
from temporary_table X 
where not exists (
     select 1 
     from target_table Y 
     where Y.name = X.name 
      and Y.surname = X.surname 
    ); 

至於步驟1:使用陣列在C#中分批將數據發送到Oracle或忘掉C#和使用Oracle SQL結合*加載程序或外部表以最快的方式。

相關問題