首页 > 解决方案 > 将具有多个工作表的 Excel 文件读入数据库

问题描述

我在这里泡菜。我正在使用 exceldatareader 的数据集函数读取具有三个工作表的 excel 文件。阅读文件后,我有一个包含三个表的数据集,每个工作表一个。

现在我需要将这些数据逐行导出到两个不同的 sql 表中。这些表具有自动增量主键,表 A 的 PK 构成了 TableB 中的 FK。我正在使用带有 SCOPE_IDENTITY() 的存储过程来实现这一点。

excel文件中的每一列都是存储过程中的一个变量,因此当我逐行迭代工作表时,我可以分配这些变量,然后通过存储过程发送它们。

现在的问题是我如何遍历这个数据集并将每一行 [col] 分配给我的存储过程的变量。

感谢帮助。

更新更多信息:

1.Sheet 1 转到 sql
2 中的表 1。Sheet 2 转到 sql
3 中的表 2。Sheet 3 也转到sql 4 中的表 2。表
1 与表 2 有一对多的关系

标签: c#

解决方案


以下是一些半伪代码样板文件:

var datatable = dataset.Tables[0];
using(var proc = connection.CreateCommand(...))
{
    proc.Parameters.Add("@firstcolumnname", SqlDbType.Int);
    foreach(DataRow dr in datatable.Rows)
    {
        /* check for DbNull.Value if source column is nullable! */
        proc.Parameters["@firstcolumnname"].Value = dr["FirstColumnName"];

        proc.ExecuteNonQuery();
    }
}

但这只有在存储过程中进行一些数据处理时才有意义。否则,这需要批量插入,尤其是当您在 excel 表中有很多(数千)行时。

一对多关系(外键)可能很棘手,如果您可以控制插入的顺序,那么只需从“一”表开始,然后再加载“多”表。如果键值不是 Excel 源数据的一部分,则让存储过程与键值匹配。

如果您在并发多用户环境中并且在加载时访问和写入表,则完全不同的故事。然后,您必须添加事务以在整个过程中保持引用完整性。


推荐阅读