我正在使用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
的Identity值。任何一个例子都会很棒。我用谷歌搜索了,SO上的所有帖子都没有给出一个工作示例。
答案 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);