使用 SQLBulkCopy 插入到相关表中



我正在使用 SQL Bulk Copy 将数据从 Excel 读取到 SQL DB。在数据库中,我有两个表,我需要将Excel中的数据插入其中。Table ATable 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 上没有一个线程无法给出工作示例。

AFAIK 批量复制只能用于上传到单个表中。因此,为了实现批量上传到两个表中,您将需要两次批量上传。 您的问题来自使用作为标识的外键。 但是,您可以解决此问题。我很确定批量复制是按顺序上传的,这意味着如果您上传 1,000 条记录并且最后一条记录的 ID 为 10,197,那么第一条记录的 ID 是 9,198! 所以我的建议是上传您的第一个表,在上传后检查最大 id,扣除记录数并从那里开始工作!

当然,在使用率高的数据库中,有人可能会在您之后插入,因此您需要通过选择与您的最后一个记录匹配的其他详细信息来获取顶部 ID(假设(最多(所有字段的组合将保证是唯一的(。 只有您知道这是否可能是一个问题。

另一种方法是首先不使用标识列,但我认为您无法控制设计?在我年轻的时候,我犯了使用身份的错误,我现在从来没有这样做过。他们总能找到回来咬人的方法!

例如,要添加第二个数据:

DataTable secondTable = new DataTable("SecondTable");
secondTable.Columns.Add("ForeignKey", typeof(int));
secondTable.Columns.Add("DataField", typeof(yourDataType));

将数据添加到第二个表。

(取决于第二个数据的格式(

int cnt = 0;
foreach (var d in mySecondData)
{
DataRow newRow = secondTable.NewRow();
newRow["ForeignKey"] = cnt;
newRow["DataField"] = d.YourData;
secondTable.Rows.Add(newRow);
}

然后在你找到起始身份(int startID(之后。

for (int i = 0; i < secondTable.Rows.Count; i++)
{
secondTable["ForeignKey"] = secondTable["ForeignKey"] + startID;
}

最后:

bulkCopy.DestinationTableName = "YourSecondTable";
bulkCopy.WriteToServer(secondTable);

最新更新