使用SQLBulkCopy插入相关表

时间:2017-07-04 06:08:35

标签: c# sql-server database excel

我正在使用SQL批量复制将数据从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的Identity值。任何一个例子都会很棒。我用谷歌搜索了,SO上的所有帖子都没有给出一个工作示例。

1 个答案:

答案 0 :(得分:0)

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));

...

将数据添加到secondTable。

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

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);