IT박스

ID 열이있는 SqlBulkCopy 삽입

itboxs 2020. 12. 2. 08:16
반응형

ID 열이있는 SqlBulkCopy 삽입


SqlBulkCopy개체를 사용하여 생성 된 2 백만 개의 행을 데이터베이스에 삽입하고 있습니다. 유일한 문제는 내가 삽입하는 테이블에 ID 열이 있다는 것입니다. 내가 설정 시도 SqlBulkCopyOptionsSqlBulkCopyOptions.KeepIdentity와에 ID 열 설정 0의 ' DbNull.Valuenull. 어느 것도 효과가 없었습니다. 누군가 나를 깨우쳐 줄 수 있다면 아주 간단한 것을 놓치고있는 것 같습니다. 감사!

편집 명확히하기 위해 DataTableI am importing에 설정된 ID 값이 없습니다 . 가져 오기의 일부로 생성되기를 원합니다.

edit 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);
}

대상 테이블에 ID를 할당하려면 SqlBulkCopyOptions.KeepIdentity옵션을 사용하지 마십시오 . 대신 원본에서 ID를 매핑하지 말고 원본에서 추출하여 SqlBulkCopy.


채움 ColumnMappingBulkCopy개체 및 ID 열을 매핑하지 않습니다. ID 열은 대상 데이터베이스에 의해 생성됩니다.


두 가지 옵션이 있습니다.

1- KeepIdentity소스 Identity값을 사용 하고 보존 합니다.

2- Identity필드를 매핑하지 마십시오 . 값을 할당하지 않으면 대상 테이블이 자동으로 할당합니다.


예, 당신은 SqlBulkCopyOptions.KeepIdentity옵션을 사용하는 것이 맞습니다. 대량 복사 작가는이 개체가 시작 열에서 쓰는 테이블 구조가 무엇인지 생각하지 않으므로 필요에 따라 동일한 방식으로 내 테이블의 ID 필드를 유지해야합니다. 나머지 필요한 열이있는 데이터 테이블 개체에 추가 열이 있고이 열에 null 값을 전달하면 테이블이 자동으로 ID를 처리합니다.


이것이 .NET Core에서 해결 한 방법입니다 ( dt데이터 테이블입니다).

dt.Columns.Cast<DataColumn>().ForEach((c, i) => sqlBulkCopy.ColumnMappings.Add(c.ColumnName, i + 1));

기본적으로 Id0 대신 1부터 시작하는 서수로 대상 열을 할당하여 ID ( ) 열을 건너 뜁니다 .


이것은 테이블입니다

CREATE TABLE [dbo].[ProductShippingMethodMap](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ProductId] [int] NOT NULL,
    [ShippingMethodId] [int] NOT NULL,
    [ParentProductId] [int] NOT NULL,
 CONSTRAINT [PK_ProductShippingMethodMap] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

다음 C # 코드가 작동합니다.

 DataTable dtQtyData = new DataTable();
        dtQtyData.Clear();
        dtQtyData.Columns.Add("Id", typeof(int));

    dtQtyData.Columns.Add("ProductId", typeof(int));
    dtQtyData.Columns.Add("ShippingMethodId", typeof(int));
    dtQtyData.Columns.Add("ParentProductId", typeof(int));


    for (int i = 0; i < ShippingMethodIds.Length; i++)
    {
        for (int j = 0; j < ProductIds.Length; j++)
        {
            var productId = ProductIds[j];
            var shippingMethodId = ShippingMethodIds[i];
            dtQtyData.Rows.Add(new object[] {0,productId, shippingMethodId, parentProductId });
        }

    }
    var connectionString = new DataSettingsManager().LoadSettings().DataConnectionString;
    SqlBulkCopy bulkcopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.Default);
    bulkcopy.DestinationTableName = "ProductShippingMethodMap";
    bulkcopy.WriteToServer(dtQtyData);

Cause :- There were some empty rows in the excel at the end of the data, which possibly looks like blank rows. Bulk upload was trying to upload these blank rows into the table.

Solution :- Select only the rows which contains data - copy the data into the new sheet. Say you have your data in 'Sheet 1', move it to 'Sheet 2' and delete 'Sheet 1'.


In my case it turned out to be blank space inside the column name and in one of the columns I had accidently used hyphon (-) instead of underscore (_) in my SQL table. I replaced blank space and hyphon with underscore in the sql table and it fixed the problem.

참고URL : https://stackoverflow.com/questions/6651809/sqlbulkcopy-insert-with-identity-column

반응형