将csv文件/ excel导入sql数据库asp.net

我正在使用c#启动asp.net visual studio 2008 / SQL 2000(将来的2005)项目。

对我来说棘手的部分是现有的数据库模式经常更改,导入文件列都必须与现有的数据库模式匹配,因为它们可能不是列名称上的一对一匹配。 (有一个查找表,它提供了我将使用的列名称的表模式)

我正在探索不同的方法来解决这个问题,并需要一些专家建议。 是否有任何现有的控件或框架可用于执行此操作?

到目前为止,我探索了FileUpload .NET控件,以及一些第三方上传控件来完成上传,如SlickUpload,但上传的文件应<500mb

下一部分是读取我的csv / excel并解析它以显示给用户,以便它们可以与我们的db模式匹配。 我看过CSVReader和其他人,但是因为我需要支持不同的版本,所以更难以实现。

实质上执行此导入的用户将从此导入文件中插入和/或更新多个表。 还有其他更高级的要求,如记录匹配,但预览了导入记录,但我希望首先了解如何执行此操作。

更新:我最终使用csvReader和LumenWorks.Framework上传csv文件。

查看优秀的FileHelpers库 – 有一篇关于它的CodeProject文章 ,它在这里托管。

它是纯粹的C#,它可以导入任何平面文件,CSV,它也可以处理Excel。 导入是完全可配置的 – 您可以定义要跳过的分隔符,行和/或列等内容 – 许多选项。

我已经成功地在各种项目中使用它,它只是完美无缺 – 非常值得推荐。

您可以轻松地在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,根据需要映射列,并存储结果在您的数据库中。

我怀疑可能存在一些强大而灵活的工具来帮助您处理这个可能非常复杂的应用程序,希望有人能指出这一点。

同时,这里有一个我发现有用的function可以将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; } } 

FileHelpers是你的朋友。 我愉快地用它来做几个项目,这给我带来了很多悲伤和劳动

我正在使用LumenWorks.Framework中的csvReader将csv文件上传和导入到sql表和内存中的DataTable,这是我根据导入的列创建的。

我还让用户映射ui中的字段,并通过将每个记录标记为插入/更新/错误来继续validation和准备要导入的数据。 然后,我为每个将受影响的表创建/填充强类型DataSet,并为Enterprise Library UpdateDataset()方法构建插入/更新查询。

然后我提交事务来插入/更新数据库。 –

映射是一个包含4列的网格。 (导入字段名称,目标表,目标字段名称,忽略,匹配状态),目标表和字段名称选择基于所选表的刷新。 我动态填充选择。 如果找到匹配,最初选择组合将填充1个值,或者如果不匹配则请选择。 ignore允许用户忽略该字段。 匹配状态是指字段是否已自动映射