현재 Excel 파일을 업로드하고 내용을 SQL Server 데이터베이스에 저장하고 SqlBulkCopy
및 DbDataReader
을 사용하여 Asp.Net 사이트를 작성하고 있습니다.DbDataReader를 사용하는 SqlBulkCopy의 무작위 동작
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
의 마지막 호출은
열 '넷'DBNull.Value을 허용하지 않는 없다는 오류가 발생합니다.
.
그러나 내 테스트 파일에는 널 (Null)이 없습니다. 그들 중 일부는 실패하고 일부는 작동합니다. 그것은 다른 파일에 대한 다른 열에 대해 불평하지만, 항상 특정 파일에 대해 동일합니다.
는 여기에서 지금까지 시도 무엇과 결론 :
내가 데이터 오류를 확인하기 위해 더 작은 조각으로 내 테스트 파일 중 하나를 분할. 작은 파일이 작동하기 때문에 원본 파일에서 파산 될 때까지 더 많은 행을 추가했습니다. 이것은 데이터 오류를 나타냅니다. 그러나 행이 잘 보이고 그것을 다른 파일에 넣으면 작동합니다. 그리고 두 번째 마지막으로 이동하고 (지금) 마지막 행을 제거하고 작동합니다. 데이터 오류가 아닙니다.
다음 아이디어는 크기였습니다. 끊어 질 때까지 하나씩 행을 추가 할 때 반복적 인 동작이 발생했습니다. 행과 파일을 추가하면 작동하지 않습니다. 그것을 제거하고 작동합니다. 그리고 매직 넘버는 13959 행이었습니다. 하지만 작동하는 파일 중 일부는 더 크므로 작동하지 않는 다른 파일을 시도했습니다. 그것은 똑같은 행동을 보여 주었지만, 14259 행 이후에 문제가 발생했습니다. Size와 관련된 문제를 보여 주지만 크기 문제는 아닙니다. 반복 가능하지만 파일마다 다릅니다. 그리고 - 다시 한번 - 다른, 더 큰 파일들이 작동합니다.
모든 종류의 시간 초과 및 SqlBulkCopy의 대량화를 시도해 보았습니다.
XML, HDR 등의 유무에 관계없이 모든 종류의 ADODB 공급자 문자열을 Excel에서 시도했습니다. 변경되지 않았습니다.
세 가지 ACE 드라이버 패키지 (64 비트 Windows 10 및 Office 2010 64 비트를 실행하므로 하나의 수정이 필요하지만 몇 가지 문제점이있어서 읽음으로써 Office 2007과 32를 시도 함) 비트도). 변경 없음.
실제로 DataReader 행 단위로 읽는 코드를 추가하고 데이터베이스에 쓰는 대신 Excel을 읽는 것이 문제가 될 경우 Net = Nothing 인 행을 찾습니다. 아무 것도 찾을 수 없습니다.
아무에게도 테스트를위한 추가 사항이나 현재 상황에 대한 통찰력을 제공 할 수 있기를 바랍니다. 나에게 이해가되지 않는다 ....
감사
UPDATE : 고든에 의해 제안 선택 Excel에서 모든 열 이름을 추가 시도
(감사합니다!). 일하지 않았어.
또한 Bruce (감사합니다!)가 제안한대로 다른 파일에 오류를 던진 몇 가지 매개 변수에 대해 "xx는 null이 아닙니다."를 추가하려고 시도했습니다. 그러면 오류가 사라지고 파일이 업로드됩니다. 그러나 파일의 일부만 가져옵니다. 한 파일의 경우 14088 개의 레코드가 파일에 30727의 업로드되었고 다른 파일의 경우 14305는 81195 개의 레코드로 업로드되었습니다.
여전히 레코드 수에는 논리가 없지만 Excel에서는 명백한 데이터 오류 또는 null 값이 없습니다. 그것은 이해가되지 않습니다 ...
그리고 Excel에서 읽거나 데이터베이스에 삽입 할 때 오류가 발생하는지 확실하지 않습니다.
또한 업로드를 수행 할 때 이벤트 로그에서이 파일을 발견했습니다. 그것이 관련이 있는지 전혀 모른다.
"SQL Server 프로세스 메모리의 상당 부분이 페이지 아웃되어 성능 저하가 발생할 수 있습니다. 작업 시간 (KB) : 141460, 커밋 (KB) : 393412, 메모리 사용률 : 35 %%. "
시도해보십시오. 더 나아지지 않았다. – AJ17
BatchSize = 1000 증가 시키십시오. –