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

Posted

技术标签:

【中文标题】将csv文件/excel导入sql数据库asp.net【英文标题】:import csv file/excel into sql database asp.net 【发布时间】:2010-10-04 03:04:30 【问题描述】:

我正在使用 c# 使用 asp.net visual studio 2008 / SQL 2000(未来为 2005)开始一个项目。

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

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

到目前为止,我探索了 FileUpload .NET 控件,以及一些 3rd 方上传控件来完成上传,例如 SlickUpload,但上传的文件应该

下一部分是读取我的 csv /excel 并对其进行解析以显示给用户,以便他们可以将其与我们的 db 架构相匹配。我看到了CSVReader 和其他人,但对于 excel,它更难,因为我需要支持不同的版本。

基本上执行此导入的用户将从该导入文件中插入和/或更新多个表。还有其他更高级的要求,例如记录匹配和导入记录的预览,但我希望先了解如何做到这一点。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

是的,我使用的是 sql server 2000,但它也需要支持 sql server 2005。我不熟悉 SqlBulkCopy 并将对此进行调查。我想我需要使用其他东西才能更新 对了。所以你需要同时进行插入和更新? SqlBulkCopy 非常适合有效地将大量数据插入数据库,但不直接处理更新。您可以使用临时表和一些额外的 SQL 将数据移动到您真正想要修改的表中来解决这个问题。【参考方案2】:

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

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

【讨论】:

很遗憾,这不适用于 x64 机器,因为 jet 仅适用于 x86 平台。【参考方案3】:

查看出色的 FileHelpers 库 - 有一个关于它的 article on CodeProject,它托管在 here。

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

我已在各种项目中成功使用它,而且它完美无瑕 - 强烈推荐。

【讨论】:

感谢 Marc 的链接,查看 FileHelpers 我发现我需要定义一个类,该类映射到我需要动态的源/目标文件中的记录。由于我的 csv 或 excel 文件格式不同,因此需要与我的目标列匹配。 好的,我明白了你的问题 - 不知道你怎么可能轻松解决这个问题,不过 :-( 完全动态的东西......不是很容易做的事情!祝你搜索顺利。 【参考方案4】:

FileHelpers 是你的朋友。我已经愉快地将它用于几个项目,它为我节省了很多痛苦和劳力

【讨论】:

【参考方案5】:

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

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

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

映射是一个有 4 列的网格。 (导入字段名称、目标表、目标字段名称、忽略、匹配状态),目标表和字段名称被选择,根据所选表刷新。我动态填充选择。如果找到匹配项,则最初选择组合填充 1 个值,否则请选择。 ignore 允许用户忽略该字段。匹配状态是字段是否被自动映射

【讨论】:

以上是关于将csv文件/excel导入sql数据库asp.net的主要内容,如果未能解决你的问题,请参考以下文章

pl/sql text importer导入csv时少一半数据

csv从excel导入phpmyadmin缺少数据

如何导入excel并存入数据库

将超过 255 个字符从 excel 导入到 sql server(上一个问题 - 如何使用 ssis 将文本限定 CSV 动态加载到 sql server)

快速将CSV文件导入Excel文件

访问数据项目在VBA中导入CSV文件