DbDataReader를 사용한 SqlBulkCopy의 임의 동작

asp.net excel sqlbulkcopy sql-server

문제

현재 Excel 파일을 업로드하고 내용을 SQL Server 데이터베이스에 저장하고 SqlBulkCopyDbDataReader 를 사용하여 Asp.Net 사이트를 작성하고 있습니다.

Excel 테이블과 데이터베이스 테이블의 열 이름은 동일합니다.

관련 코드 (명확성을 위해 감소 된 열 매핑 수)

' Connection String to Excel Workbook
Dim excelConnectionString As String = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0", path)
Dim connection As New OleDbConnection()
connection.ConnectionString = excelConnectionString
Dim command As New OleDbCommand("select * from [Sheet1$]", connection)

' Bulk Copy to SQL Server 
Dim bulkInsert As New SqlBulkCopy(sqlConnectionString)
bulkInsert.DestinationTableName = "UploadedOrders"
bulkInsert.BulkCopyTimeout = 0
bulkInsert.BatchSize = 50
bulkInsert.ColumnMappings.Add("Id", "Id")
bulkInsert.ColumnMappings.Add("CustomerId", "CustomerId")
bulkInsert.ColumnMappings.Add("Net", "Net")
... rest of columns

connection.Open()
Dim dr As DbDataReader = command.ExecuteReader()
bulkInsert.WriteToServer(dr)

WriteToServer 의 마지막 호출에서 오류가 발생했습니다.

열 'Net'은 DBNull.Value를 허용하지 않습니다.

그렇지 않습니다.

그러나 내 테스트 파일에는 Null이 없습니다. 그들 중 일부는 실패하고 일부는 작동합니다. 그것은 다른 파일에 대한 다른 열에 대해 불평하지만, 항상 특정 파일에 대해 동일합니다.

여기에 내가 지금까지 시도한 것과 결론을 요약 해 놓았다.

  1. 데이터 오류를 식별하기 위해 테스트 파일 중 하나를 작은 조각으로 나눕니다. 작은 파일이 작동하기 때문에 원본 파일에서 파산 될 때까지 더 많은 행을 추가했습니다. 이것은 데이터 오류를 나타냅니다. 그러나 행이 잘 보이고 그것을 다른 파일에 넣으면 작동합니다. 그리고 두 번째 마지막으로 이동하고 (지금) 마지막 행을 제거하고 작동합니다. 데이터 오류가 아닙니다.

  2. 다음 아이디어는 크기 였고, 파열 될 때까지 하나씩 행을 추가 할 때 반복적 인 동작이있었습니다. 행과 파일을 추가하면 작동하지 않습니다. 그것을 제거하고 작동합니다. 그리고 매직 넘버는 13959 행이었습니다. 하지만 작동하는 파일 중 일부는 더 크므로 작동하지 않는 다른 파일을 시도했습니다. 그것은 똑같은 행동을 보여 주었지만, 14259 행 이후에 문제가 발생했습니다. Size와 관련된 문제를 보여 주지만 크기 문제는 아닙니다. 반복 가능하지만 파일마다 다릅니다. 그리고 - 다시 한번 - 다른, 더 큰 파일들이 작동합니다.

  3. 모든 종류의 타임 아웃과 SqlBulkCopy의 대량화를 시도해 보았습니다.

  4. 모든 종류의 ADODB 공급자 문자열을 XML, HDR 등의 유무에 관계없이 12, 8을 사용하여 테스트했습니다. 변경하지 않았습니다.

  5. ACE 드라이버 세 가지 패키지를 사용해 보았습니다. (저는 64 비트 Windows 10 및 Office 2010 64 비트를 실행 중이므로 하나는 정확해야하지만 몇 가지 문제가있어 읽음으로써 Office 2007 및 32 비트도 시도했습니다). 변경 없음.

  6. 행별로 DataReader 행을 통해 실제로 읽도록 코드를 잘라내어 데이터베이스에 쓰는 대신 Excel을 읽는 문제인 경우 Net = Nothing 행을 찾습니다. 아무 것도 찾을 수 없습니다.

  7. 테스트를 위해 더 많은 것을 제공 할 수 있기를 바라거나, 진행 상황에 대한 통찰력을 얻기 위해 여기에 질문을 추가했습니다. 나에게 이해가되지 않는다 ....

감사

최신 정보:

Excel에서 모든 열 이름을 추가하려고 시도하면 Gordon이 제안한대로 선택합니다 (감사합니다!). 일하지 않았어.

또한 Bruce (감사합니다!)에 의해 제안 된대로 다른 파일에 오류를 던진 몇 가지 매개 변수에 대해 "xx는 null이 아닙니다."라는 추가를 시도했습니다. 그러면 오류가 사라지고 파일이 업로드됩니다. 그러나 파일의 일부만 가져옵니다. 한 파일의 경우 14088 개의 레코드가 파일에 30727의 업로드되었고 다른 파일의 경우 14305는 81195 개의 레코드로 업로드되었습니다.

여전히 레코드 수에는 논리가 없으며 Excel에서는 명백한 데이터 오류 또는 null 값이 없습니다. 이해가 가지 않는다 ...

그리고 Excel에서 읽거나 데이터베이스에 삽입 할 때 오류가 발생하는지 확실하지 않습니다.

또한 업로드를 수행 할 때 이벤트 로그에서이를 발견했습니다. 그것이 관련이 있는지 전혀 모른다.

SQL Server 프로세스 메모리의 상당 부분이 페이징되어 성능 저하를 초래할 수 있습니다. 작업 시간 (KB) : 141460, 커밋 (KB) : 393412, 메모리 사용률 : 35 %%.

인기 답변

좋아, 그래서 문제와 해결책을 발견했다.

BulkCopy 또는 데이터베이스와 관련이 없음을 알립니다. 그것은 엑셀에서 읽은 것이 었습니다.

더 많은 디버깅과 임시 코드를 통해 Excel에서 DataReader로 읽은 레코드가 14 개 밖에되지 않는다는 것을 알았습니다.

IMEX = 1을 연결 문자열에 추가하고 이중 + 삼중 따옴표를 정리하면 작동합니다. 에이스 연결 문자열은 다음과 같습니다 :

"공급자 = Microsoft.ACE.OLEDB.12.0, 데이터 원본 = {0}, 확장 속성 =" "Excel 8.0, HDR = 예, IMEX = 1," "", 경로)

모든 입력에 감사드립니다. 대단히 감사합니다.



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