2009-01-28 151 views
10

我正在用asp.net visual studio 2008/SQL 2000(2005年將來)使用c#開始一個項目。將csv文件/ excel導入到sql數據庫asp.net

對我來說,棘手的部分是現有的數據庫模式經常變化,導入文件列都必須與現有的數據庫模式匹配,因爲它們可能不是列名稱上的一對一匹配。 (有一個查找表,提供表格架構與我將使用的列名稱)

我正在探索不同的方法來解決這個問題,並需要一些專家的建議。是否有任何現有的控件或框架可以用來完成這些任務?

到目前爲止,我探討的FileUpload .NET控件,以及一些第三方上傳控件實現上載如SlickUpload但上傳的應該是< 500MB

下一部分是讀我的CSV的文件/ Excel和解析它以顯示給用戶,以便它們可以與我們的數據庫模式相匹配。我看到了CSVReader等等,但對於excel來說更難,因爲我需要支持不同的版本。

本質上執行此導入的用戶將從此導入文件中插入和/或更新多個表。還有其他更多先進的要求,例如記錄匹配,但還有預覽導入記錄,但我希望通過理解如何首先執行此操作。

更新:我最終使用csvReader與LumenWorks.Framework上傳csv文件。

回答

1

我使用LumenWorks.Framework的csvReader上傳和導入csv文件到我創建的內存中的一個sql表和一個數據表在導入的列上。

我也有用戶映射ui中的字段,並通過將每條記錄標記爲插入/更新/錯誤來繼續驗證並準備要導入的數據。然後,我爲每個將受到影響的表創建/填充強類型化的DataSet,併爲Enterprise Library UpdateDataset()方法構建插入/更新查詢。

然後我提交事務來插入/更新數據庫。 -

映射是一個有4列的網格。 (導入字段名稱,目的地表格,目標字段名稱,忽略,匹配狀態),目標表格和字段名稱是根據所選表格進行選擇的選擇。我動態填充選擇。如果找到匹配項,則最初選擇組合值爲1,或者選擇是否不匹配。忽略允許用戶忽略該字段。匹配狀態是如果一個字段自動映射

5

您可以通過Excel或CSV文件輕鬆創建IDataReader(請參閱http://support.microsoft.com/kb/316934)。

您是否使用SQL Server作爲您的數據庫引擎?如果是這樣,您可以使用SqlBulkCopy類(http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx)來有效攜帶IDataReader,根據需要映射列,並將結果存儲在數據庫中。

+0

是的,我使用的是SQL Server 2000,但它也需要支持SQL Server 2005。我不熟悉SqlBulkCopy,並會研究這一點。我想我會需要使用別的東西才能更新 – kiev 2009-01-29 14:38:25

+0

啊對。所以你需要做插入和更新? SqlBulkCopy非常適合將大量數據高效地插入數據庫,但不直接處理更新。 您可以使用臨時表和其他一些SQL將數據移動到您真正想要修改的表中來解決此問題。 – 2009-01-30 00:40:16

3

我懷疑可能存在一些強大而靈活的工具來幫助您處理這個可能非常複雜的應用程序,希望有人會指出您。

與此同時,這裏有一個函數,我發現有用的將Excel文件轉換爲DataTable。此版本僅查找第一個工作表。它可能是一個起點。爲了與csv文件類似,只需要修改連接字符串。

public static DataTable GetDataTableFromExcel(string SourceFilePath) 
{ 
    string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + 
           "Data Source=" + SourceFilePath + ";" + 
           "Extended Properties=Excel 8.0;"; 

    using (OleDbConnection cn = new OleDbConnection(ConnectionString)) 
    { 
     cn.Open(); 

     DataTable dbSchema = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
     if (dbSchema == null || dbSchema.Rows.Count < 1) 
     { 
      throw new Exception("Error: Could not determine the name of the first worksheet."); 
     } 

     string WorkSheetName = dbSchema.Rows[0]["TABLE_NAME"].ToString(); 

     OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [" + WorkSheetName + "]", cn); 
     DataTable dt = new DataTable(WorkSheetName); 

     da.Fill(dt); 

     return dt; 
    } 
} 
+0

不幸的是,這不適用於x64機器,因爲jet僅適用於x86平臺。 – Alex 2010-03-18 20:02:38

8

退房優秀FileHelpers庫 - 有一個article on CodeProject它,和它的託管here

它是純粹的C#,它可以導入幾乎任何平面文件,CSV,也可以處理Excel。導入是完全可配置的 - 您可以定義諸如分隔符,行和/或列之類的內容以跳過,等等 - 很多選項。

我已經成功地在各種項目中使用它,它完美地工作 - 強烈推薦。

1

FileHelpers是你的朋友。我用它愉快地爲幾個項目,它節省了我很多的悲傷和勞動