2009-01-28 150 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是你的朋友。我用它愉快地为几个项目,它节省了我很多的悲伤和劳动