SqlBulkCopy插入标识列

Fly*_*del 62 c# sql-server sqlbulkcopy identity-insert

我正在使用该SqlBulkCopy对象将数百万个生成的行插入到数据库中.唯一的问题是我插入的表有一个标识列.我已经尝试设置SqlBulkCopyOptionsto SqlBulkCopyOptions.KeepIdentity并将标识列设置为0's,DbNull.Valuenull.其中没有一个有效.我觉得我错过了一些非常简单的事情,如果有人能够启发我会很棒.谢谢!

编辑为了澄清,我没有在DataTable我导入中设置的标识值.我希望它们作为导入的一部分生成.

编辑2 这是我用来创建基础SqlBulkCopy对象的代码.

SqlBulkCopy sbc = GetBulkCopy(SqlBulkCopyOptions.KeepIdentity);
sbc.DestinationTableName = LOOKUP_TABLE;

private static SqlBulkCopy GetBulkCopy(SqlBulkCopyOptions options = 
    SqlBulkCopyOptions.Default) 
{
    Configuration cfg = WebConfigurationManager.OpenWebConfiguration("/RSWifi");
    string connString =
    cfg.ConnectionStrings.ConnectionStrings["WifiData"].ConnectionString;
    return new SqlBulkCopy(connString, options);
}
Run Code Online (Sandbox Code Playgroud)

jas*_*son 38

要使目标表分配标识,请不要使用该SqlBulkCopyOptions.KeepIdentity选项.相反,不要映射源中的标识,也不要从源中提取它以发送到SqlBulkCopy.

  • 哦,你想让目的地分配价值?从你的问题来看,这一点都不清楚.不要使用`SqlBulkCopyOptions.KeepIdentity`!关闭它,不要在映射中包含它,也不要从`source`拉出来. (4认同)
  • @FlyingStreudel:没错。`SqlBulkCopyOptions` 中有很多选项。当您不指定 `SqlBulkCopyOptions.KeepIdentity` 选项时,目标表将分配标识。 (2认同)

Wim*_*Wim 22

填写ColumnMapping了的BulkCopy对象,并没有映射标识列.标识列将由目标数据库生成.

  • 尽管我认为这是解决我的问题的答案,但我并没有真正理解它。如果不将标识列添加到“ DataTable”中,例如“ returnVal.Columns.Add(“ Id”,typeof(int));“,则会遇到映射问题。不过,不应该为该列分配值,因此不要**添加`dataRow [“ id”] = ...等。 (2认同)

JNK*_*JNK 5

你有两个选择——

1 - 使用KeepIdentity并保留源的Identity值。

2 - 不要映射Identity字段。如果您不尝试分配值,目标表将自动分配一个值。