programing

ID 열이 있는 SqlBulkCopy 삽입

goodsources 2023. 7. 5. 20:39
반응형

ID 열이 있는 SqlBulkCopy 삽입

는 사용중다니입▁the를 사용하고 있습니다.SqlBulkCopy생성된 2백만 개의 행을 데이터베이스에 삽입하는 개체입니다.유일한 문제는 제가 삽입하는 테이블에 ID 열이 있다는 것입니다.는 설해보았다니습정▁the다▁setting를 설정해 보았습니다.SqlBulkCopyOptionsSqlBulkCopyOptions.KeepIdentity을 ID 을열다설니다정합로로 합니다.0의,DbNull.Value그리고.null아무 것도 효과가 없었습니다.저는 제가 꽤 간단한 것을 놓치고 있는 것처럼 느껴집니다, 만약 누군가가 저를 깨우쳐준다면 그것은 환상적일 것입니다.감사합니다!

편집 명확하게 하기 위해 ID 값을 설정하지 않았습니다.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);
}

대상 테이블에 ID를 할당하려면SqlBulkCopyOptions.KeepIdentity선택.대신 소스에서 ID를 매핑하지 말고 소스에서 추출하여 다음으로 전송하지 마십시오.SqlBulkCopy.

다음 항목을 채웁니다.BulkCopy개체 및 ID 열을 매핑하지 않습니다.대상 데이터베이스에서 ID 열을 생성합니다.

두 가지 옵션이 있습니다.

-1 사용 - 사용KeepIdentity▁and▁preserve▁the 보존합니다.Identity가치.

.Identity필드. 값을 할당하지 않으면 대상 테이블이 자동으로 값을 할당합니다.

이것은 테이블입니다.

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

.NET했습니다.NET에서 이렇게 풀었습니다 (dt데이터 테이블임):

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

은 기본적으로합니다.Id) 에는 목적지 0 ~ 1이

예, 올바른 사용 방법입니다.SqlBulkCopyOptions.KeepIdentity옵션을 선택하면 대량 복사 작성자는 이 개체를 시작 열에서 쓰는 테이블 구조가 무엇이라고 생각하지 않습니다. , 는 내 를 보존하기 같은 . 단지 의 데이터 을 만들고 이합니다.나는 내 테이블의 ID 필드를 보존하기 위해 동일한 방법으로 하고 있습니다. 단지 당신은 나머지 필요한 열로 데이터 테이블 개체에 추가 열을 만들고 이 열에 null 값을 전달하면 테이블이 자동으로 ID를 처리합니다.

JDBC SQLServerBulkCSV FileRecord 구조를 사용하는 경우 ID 열을 매핑해야 하지만 ID 열의 값은 무시됩니다.

제 경우에는 열 이름과 열 중 하나에서 SQL 테이블에서 밑줄(_) 대신 하이폰(-)을 실수로 사용한 빈 공간으로 밝혀졌습니다.sql table에서 빈칸과 하이폰을 언더스코어로 교체했더니 문제가 해결되었습니다.

원인:- 데이터 끝에 있는 엑셀에 빈 행이 몇 개 있어 빈 행처럼 보입니다.대량 업로드에서 빈 행을 테이블에 업로드하려고 했습니다.

솔루션 : - 데이터가 포함된 행만 선택 - 데이터를 새 시트에 복사합니다.'시트 1'에 데이터가 있다고 가정하고 '시트 2'로 이동한 후 '시트 1'을 삭제합니다.

언급URL : https://stackoverflow.com/questions/6651809/sqlbulkcopy-insert-with-identity-column

반응형