代码之家  ›  专栏  ›  技术社区  ›  Denis

使用sqlbulkcopy插入数据后检索标识列

  •  1
  • Denis  · 技术社区  · 6 年前

    我有一个模型:

    public class A {
           public int NameID {get; set; }  //this represents the identity column in the database
           public string Name { get; set; }
           public string Value { get; set; }
    }
    

    我使用了一个EnumerableDataReader,它是IDataReader的一个实现,除了没有填充identity属性:在插入之后是a.nameID之外,它似乎工作得很好。这是我的完整代码:

           var dr = new EnumerableDataReader<A>(lst);
    
            using (var bulkCopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction)) {
                bulkCopy.ColumnMappings.Add(nameof(A.NameID), "nameid");
                bulkCopy.ColumnMappings.Add(nameof(A.Name), "name");
                bulkCopy.ColumnMappings.Add(nameof(A.Value, "value");
                bulkCopy.DestinationTableName = "NameTable";
                bulkCopy.WriteToServer(dr);
            }
    

    此时,我希望所有对象的“nameid”都用当前数据库中该行的identity列值填充。

    我做错什么了?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Rudi Visser    6 年前

    SqlBulkCopy 只处理数据的复制,不是高级数据库层。因此,它不负责收回id,如果它想的话,实际上也不能这么做。

    大多数人遵循的模式是 文件复制 插入临时表,然后使用 INSERT INTO..OUTPUT Inserted.Id..SELECT * FROM #Tmp 把这些行放到主表中。

    这将允许您收回插入的id并更新模型。