2008-11-13 113 views
6

我正在尋找任何有關如何使用.NET Web應用程序創建與數據庫的接口以從Excel文件上載數據的最佳實踐或想法 我是否應該使用允許所有要加載的記錄並標記錯誤,或者我應該使用一種在發生錯誤時停止加載的機制。將文件上傳到數據庫的最佳實踐

我從來沒有必須處理這種類型的需求,所以任何幫助將超級!

謝謝

回答

1

如果你的數據庫數據的完整性是非常重要的,不允許的數據要導入有誤或不符合你的數據庫的驗證要求。

由於這些是Excel文件,用戶應該很容易地更正Excel文件中的數據,而不是嘗試使用其他接口來修復數據。只要確保錯誤消息指導用戶到什麼領域是問題,並清楚地解釋什麼是錯的。

+0

儘管驗證是好的,但請確保您儘可能以原始格式存儲。你最終在一千個你不會期望的地方進行千次轉換,並且將原始版本儘可能未轉換爲一個狀態是一個巨大的勝利。 – aronchick 2009-09-08 16:33:32

0

你想把excel文件放在數據庫中作爲blob嗎?或者你想解析這些文件並將這些文件中的記錄放入數據庫中?

我假設它是後者。

作爲用戶我想要知道錯誤是什麼,所以我可以修復它們並重試。我想我如何再次嘗試取決於我上傳的數據量。

我想嘗試做一個混合解決方案..如果只有一些錯誤顯示一個屏幕來糾正這些錯誤,以便用戶可以快速移動。如果出現大量錯誤,您應該可以做到,並讓用戶再次嘗試。

就DB而言。要麼有一個單獨的表格上傳,直到它們被檢查並獲取「真實」數據,或者有一個UploadUniqueId列,以便您可以毫不費力地回滾任何上傳。

刪除的表名,其中UploadUniqueId =「GUID」

2

您應該上傳數據,然後在驗證檢查失敗時將其標記。對於實際加載的數據,你有幾種選擇:

  • 的ADO.Net批量裝載API - 使用 批量加載API把它放在一個臨時 表。以下代碼片段顯示了打開.CSV文件的 進程和以編程方式將其加載到 臨時表中的 進程。

public void Load() { 
     bool OK = File.Exists(_filename); 
     if (OK) { 
      string sql = String.Format("Select * from {0}", FileName); 
      OleDbConnection csv = new OleDbConnection(); 
      OleDbCommand cmd = new OleDbCommand(sql, csv); 
      OleDbDataReader rs = null; 
      SqlConnection db = null; 
      SqlCommand clear = null; 

      SqlBulkCopy bulk_load = null; 
      try { 
        // Note two connections: one from the csv file 
        // and one to the database; 
        csv = new OleDbConnection(); 
        csv.ConnectionString = ConnectionString; 
        csv.Open(); 
        cmd = new OleDbCommand(sql, csv); 
        rs = cmd.ExecuteReader(); 

        // Dung out the staging table 
        db = // [Create A DB conneciton Here] 
        clear = new SqlCommand("Truncate table Staging", db); // Left to the reader 
        clear.ExecuteNonQuery(); 

        // Import into the staging table 
        bulk_load = new SqlBulkCopy(db); 
        bulk_load.DestinationTableName = Destination; // Actually an instance var 
        bulk_load.WriteToServer(rs); 
       } catch (Exception ee) { 
        string summary = ee.Message; 
        string detail = ee.StackTrace; 
        //Notify(DisplayType.error, summary, detail); 
       } finally { 
        if (rs != null) rs.Close(); 
        if (csv != null) csv.Close(); 
        if (bulk_load != null) bulk_load.Close(); 
       } 
      } 
     } 
  • 使用BCP或SSIS導入它,無論是從從.csv文件中的電子表格或 直接。
4

我會嘗試下面的方法,它在過去運行良好。

  1. 允許用戶上傳文件,將其放在磁盤上的某個位置。
  2. 將文件的結果綁定到某個網格(您可以使用傳統的連接/命令對象使用ODBC/OLE DB連接到Excel文件)。
  3. 根據一些業務規則(excel數據通常很髒)將驗證應用到網格中的行。
  4. 允許用戶更新網格中的值並更正驗證問題。
  5. 當所有數據都是猶太潔而用戶滿意時,在事務中執行批量插入。
  6. 如果發生任何「不良」情況,請回滾並提供一些用戶反饋。