방법은 SqlBulkCopy 연산 값을 삽입 여부를 알아낼

c# sqlbulkcopy

문제

삽입을 수행하는 SqlBulkCopy 메서드가 있습니다. 삽입하는 대상 테이블에는 고유 키 제약 조건이 정의되어 있으므로 대량 복사는 중복을 삽입하지 않습니다. 그러나 제한이 데이터베이스 수준에서만 있기 때문에 삽입이 완료되었는지 프로그래밍 방식으로 확인할 수는 없습니다. 내 방법은 다음과 같습니다.

string connect = "user id=*********; password=*******; server=.\\SQLEXPRESS;database=*********;";
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connect, SqlBulkCopyOptions.UseInternalTransaction))
    {
        bulkCopy.DestinationTableName = "dbo.BaseTermPrice";
        bulkCopy.ColumnMappings.Add("BaseID", "BaseID");
        bulkCopy.ColumnMappings.Add("ContractDate", "ContractDate");
        bulkCopy.ColumnMappings.Add("TermID", "TermID");
        bulkCopy.ColumnMappings.Add("Price", "Price");
        bulkCopy.ColumnMappings.Add("PeakType", "PeakType");
        try
        {
            // Write from the source to the destination.
            bulkCopy.WriteToServer(ds.Tables[0]);
        }
        catch (SqlException ex)
        {
            success = false;
            logger.Error(ex.Message);
        }
        catch (Exception ex)
        {
            success = false;
            logger.Error(ex.Message);
        }
    }

삽입이 없을 때 여기에서 예외가 없습니다. 복제본을 삽입하려고하는 사용자에게이를 알릴 수 있도록 어떻게 결정합니까?

내 고유 키 제약 조건 :

ALTER TABLE [dbo].[BaseTermPrice] ADD  CONSTRAINT [UK_BaseTermPrice] UNIQUE NONCLUSTERED 
(
[BaseID] ASC,
[ContractDate] ASC,
[TermID] ASC,
[PeakType] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
SORT_IN_TEMPDB = OFF, 
IGNORE_DUP_KEY = OFF, 
ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, 
ALLOW_PAGE_LOCKS  = ON) 
ON [PRIMARY]
GO

수락 된 답변

삽입이 없을 때 여기에서 예외가 없습니다.

IGNORE_DUP_KEY = ON 고유 인덱스를 만들었습니까? 이것은 데이터 오류를 숨기므로 나쁜 관행입니다.

이 옵션이 false 인 경우, 대량 삽입 작업 예외가 발생합니다. 그렇지 않은 경우 오류 로깅이 손상됩니다. 디버거가 모든 예외를 중단하도록 설정하십시오.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.