繁体   English   中英

使用SQLBulkCopy插入相关表

[英]Using SQLBulkCopy to Insert into Related Tables

我正在使用SQL批量复制从Excel读取数据到SQL DB。 在数据库中,我有两个表需要从Excel中插入此数据。 Table ATable B ,它使用从ID(主键IDENTITY) Table A来插入相应的行记录到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值。任何示例都很好。 我用谷歌搜索,所以没有一个线程不能给出工作示例。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM