C# 使用c进行大容量复制时,标识列插入不起作用

C# 使用c进行大容量复制时,标识列插入不起作用,c#,insert,ssis,identity,C#,Insert,Ssis,Identity,我在Prod中有一个源表,如下所示: SELECT '-1' as PKey, NULL as ID, 'Unknown' as Name UNION SELECT '1' as PKey, 01 as ID, 'ABC' as Name UNION SELECT '2' as PKey, 02 as ID, 'XYZ' as Name 我想将其复制到DEV环境中。为此,我有一个Foreach循环容器,其中包含以下三个任务: 1 Identity_Ins

我在Prod中有一个源表,如下所示:

    SELECT '-1' as PKey, NULL as ID, 'Unknown' as Name
    UNION
    SELECT '1' as PKey, 01 as ID, 'ABC' as Name
    UNION
    SELECT '2' as PKey, 02 as ID, 'XYZ' as Name
我想将其复制到DEV环境中。为此,我有一个Foreach循环容器,其中包含以下三个任务:

1 Identity_Insert ON:检查表是否有任何Identity列,如果有,则将其设置为ON。我已经测试过了,它可以工作

2脚本任务1:使用以下代码将数据从PROD移动到DEV

    try{
        string connectionString =
                @"Data Source=Prod_Server;Initial Catalog=Source_DB;Integrated Security=SSPI;";
        // get the source data
        using (SqlConnection sourceConnection =
                new SqlConnection(connectionString))
        {
            SqlCommand myCommand =
                new SqlCommand("SELECT * FROM " + TableName, sourceConnection);
            sourceConnection.Open();
            SqlDataReader reader = myCommand.ExecuteReader();

            // open the destination data
            string connectionString1 = @"Data Source=Dev_Server;Initial Catalog=Dest_DB;Integrated Security=SSPI;";

            using (SqlConnection destinationConnection =
                        new SqlConnection(connectionString1))
            {
                // open the connection
                destinationConnection.Open();

                using (SqlBulkCopy bulkCopy =
                new SqlBulkCopy(destinationConnection.ConnectionString, SqlBulkCopyOptions.KeepNulls & SqlBulkCopyOptions.KeepIdentity))
                {
                    bulkCopy.BatchSize = 500;
                    bulkCopy.NotifyAfter = 1000;
                    bulkCopy.SqlRowsCopied +=
                        new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
                    bulkCopy.DestinationTableName = TableName;
                    bulkCopy.WriteToServer(reader);
                }
            }
            reader.Close();
            //MessageBox.Show("Data copied successfully!!");
        }
        }
            catch(Exception E){
                Console.WriteLine(E.Message);
            }
3 Identity_Insert OFF:检查表是否有任何Identity列,如果有,则将其设置为OFF

在此过程之后..我的目标表如下所示:

    SELECT '1' as PKey, NULL as ID, 'Unknown' as Name
    UNION
    SELECT '2' as PKey, 01 as ID, 'ABC' as Name
    UNION
    SELECT '3' as PKey, 02 as ID, 'XYZ' as Name
因此,它正确地复制了数据,但根记录的标识字段没有复制。它不是-1,而是从1开始


有人知道我做错了什么吗?

我相信你想看看《你是对的兄弟》的KeepIdentity部分。我已经更新了脚本,包括“SqlBulkCopyOptions.KeepNulls&SqlBulkCopyOptions.KeepIdentity”…但这仍然没有帮助。仍然得到同样的结果。我注意到的另一件事是您正在使用*。我会显式地映射列。我知道文档中说,如果列的计数和位置相同,这并不重要,但是当涉及到标识列时,SQL可能会变得太聪明。要查看这是否是正确的路径,请运行DBCC CHECKIDENT将列重新设定为25,然后在值变为26、27、28时运行导入,因为标识正在运行。