10

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

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

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

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

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

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

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

4

5 回答 5

8

查看出色的 FileHelpers 库——在 CodeProject 上有一篇关于它的文章,它位于此处

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

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

于 2009-01-29T06:08:43.073 回答
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,根据需要映射列,并存储结果在您的数据库中。

于 2009-01-29T01:57:13.113 回答
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;
    }
}
于 2009-01-29T02:11:49.917 回答
1

FileHelpers是您的朋友。我已经愉快地将它用于几个项目,它为我节省了很多悲伤和劳动

于 2009-01-29T06:51:22.160 回答
1

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

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

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

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

于 2010-10-05T19:39:20.117 回答