Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SQLBulkCopy插入到相关表中_C#_Sql Server_Database_Excel - Fatal编程技术网

C# 使用SQLBulkCopy插入到相关表中

C# 使用SQLBulkCopy插入到相关表中,c#,sql-server,database,excel,C#,Sql Server,Database,Excel,我正在使用SQL批量复制将数据从Excel读取到SQL DB。在数据库中,我有两个表,需要将Excel中的数据插入其中表A和表B使用表A中的ID(主键标识)将相应的行记录插入表B 我可以使用以下代码插入一个表(表A) using (SqlConnection connection = new SqlConnection(strConnection)) { connection.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCop

我正在使用SQL批量复制将数据从Excel读取到SQL DB。在数据库中,我有两个表,需要将Excel中的数据插入其中<代码>表A和
表B
使用
表A
中的ID(主键标识)将相应的行记录插入
表B

我可以使用以下代码插入一个表(
表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);
        }
    }
}

但是,我不知道如何将它扩展到两个由外键关系绑定的表。特别是,
表B
使用了
表A
中的标识值。任何示例都很好。我用谷歌搜索了一下,没有一个线程在上面,因此无法给出一个工作示例。

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

当然,在高使用率的数据库中,可能会有人在您之后插入,因此您需要通过选择与上一个匹配的记录(假设所有字段的组合都是唯一的)来获取顶级id。只有你知道这是否可能是个问题

另一种选择是首先不使用标识列,但我想您对设计没有控制权?在我年轻的时候,我犯了使用身份的错误,我现在从来没有这样做过。他们总是想办法回来咬

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

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

将数据添加到第二个表中

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

然后在找到起始标识(int startID)之后


只能使用此方法加载一个表。为什么不创建一个包含两个数据表及其关系集的数据集,然后保存该数据集?@rene我认为数据集路由不起作用有两个原因。首先,键是一个标识,因此在创建数据集时,值是未知的;其次,我认为您不能复制数据集,只能复制一个数据表,我认为OP对速度感兴趣@JonathanWillcock当然,我不是有意在这种情况下使用SqlBulkCopy。如果速度是个问题,那么我宁愿先测试它,如果它真的重要的话。先插入到一个临时表中,然后使用SQL查询来管理插入到基表中的内容。这将使处理
IDENTITY
值变得更加容易,因为您可以使用
INSERT
OUTPUT
子句捕获这些值。@Alex,基表中已经有一些行了。你的技术在这种情况下也有效吗?请告诉我一些完整的资源来看看你的想法。ThanksI可以保证在我们执行此操作期间没有人插入数据库。是的,我也不能控制数据库设计。基本上,这是请求系统的后端数据库。现在,用户希望插入1000个左右的批量需求,而不必费力地从ui提交它们。那么,你能举一个例子说明这个多表插入是如何工作的吗?
int cnt = 0;
foreach (var d in mySecondData)
{
    DataRow newRow = secondTable.NewRow();
    newRow["ForeignKey"] = cnt;
    newRow["DataField"] = d.YourData;
    secondTable.Rows.Add(newRow);
}
for (int i = 0; i < secondTable.Rows.Count; i++)
{
    secondTable["ForeignKey"] = secondTable["ForeignKey"] + startID;
}
bulkCopy.DestinationTableName = "YourSecondTable";
bulkCopy.WriteToServer(secondTable);