【发布时间】:2017-07-04 06:08:34
【问题描述】:
我正在使用 SQL 批量复制将数据从 Excel 读取到 SQL DB。在数据库中,我有两个表,我需要从 Excel 中插入这些数据。 Table A 和 Table B 使用来自 Table A 的 ID(主键 IDENTITY)将相应的行记录插入到 Table B。
我可以使用以下代码插入一个表 (Table A)。
using (SqlConnection connection = new SqlConnection(strConnection)) {
connection.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) {
bulkCopy.DestinationTableName = "dbo.[EMPLOYEEINFO]";
try {
// Write from the source to the destination.
SqlBulkCopyColumnMapping NameMap = new SqlBulkCopyColumnMapping(data.Columns[0].ColumnName, "EmployeeName");
SqlBulkCopyColumnMapping GMap = new SqlBulkCopyColumnMapping(data.Columns[1].ColumnName, "Gender");
SqlBulkCopyColumnMapping CMap = new SqlBulkCopyColumnMapping(data.Columns[2].ColumnName, "City");
SqlBulkCopyColumnMapping AMap = new SqlBulkCopyColumnMapping(data.Columns[3].ColumnName, "HomeAddress");
bulkCopy.ColumnMappings.Add(NameMap);
bulkCopy.ColumnMappings.Add(GMap);
bulkCopy.ColumnMappings.Add(CMap);
bulkCopy.ColumnMappings.Add(AMap);
bulkCopy.WriteToServer(data);
}
catch (Exception ex) {
Console.WriteLine(ex.Message);
}
}
}
但是我不知道如何为两个受外键关系绑定的表扩展它。特别是,Table B 使用来自Table A 的标识值任何示例都会很棒。我用谷歌搜索了它,SO 上的所有线程都无法给出一个工作示例。
【问题讨论】:
-
这个方法只能加载一张表。为什么不使用两个数据表及其关系集创建一个 DataSet,然后保存该数据集?
-
@rene 我认为 DataSet 路由不起作用有两个原因。首先,关键是一个身份,因此在创建 DataSet 时不知道值,其次我认为您不能批量复制 DataSet,只是一个 DataTable,我认为 OP 对速度感兴趣!
-
@JonathanWillcock 当然,在那种情况下我并不是要使用 SqlBulkCopy 。如果速度是问题,那么我宁愿先测试,如果它真的很重要。
-
先插入临时表,然后使用 SQL 查询管理对基表的插入。这将使处理
IDENTITY值变得更加容易,因为您可以使用INSERT的OUTPUT子句来捕获它们。 -
@Alex,基本表中已经有一些行。你的技术在这种情况下也有效吗?请指点我一些完整的资源来看看你的想法。谢谢
标签: c# sql-server database excel