2016-07-26 2 views
0

현재 Excel 파일을 업로드하고 내용을 SQL Server 데이터베이스에 저장하고 SqlBulkCopyDbDataReader을 사용하여 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)이 없습니다. 그들 중 일부는 실패하고 일부는 작동합니다. 그것은 다른 파일에 대한 다른 열에 대해 불평하지만, 항상 특정 파일에 대해 동일합니다.

는 여기에서 지금까지 시도 무엇과 결론 :

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

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

  3. 모든 종류의 시간 초과 및 SqlBulkCopy의 대량화를 시도해 보았습니다.

  4. XML, HDR 등의 유무에 관계없이 모든 종류의 ADODB 공급자 문자열을 Excel에서 시도했습니다. 변경되지 않았습니다.

  5. 세 가지 ACE 드라이버 패키지 (64 비트 Windows 10 및 Office 2010 64 비트를 실행하므로 하나의 수정이 필요하지만 몇 가지 문제점이있어서 읽음으로써 Office 2007과 32를 시도 함) 비트도). 변경 없음.

  6. 실제로 DataReader 행 단위로 읽는 코드를 추가하고 데이터베이스에 쓰는 대신 Excel을 읽는 것이 문제가 될 경우 Net = Nothing 인 행을 찾습니다. 아무 것도 찾을 수 없습니다.

  7. 아무에게도 테스트를위한 추가 사항이나 현재 상황에 대한 통찰력을 제공 할 수 있기를 바랍니다. 나에게 이해가되지 않는다 ....

감사

UPDATE : 고든에 의해 제안 선택 Excel에서 모든 열 이름을 추가 시도

(감사합니다!). 일하지 않았어.

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

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

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

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

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

답변

0

SQL 문에서 열 이름을 지정해 보았습니까?

SELECT Id, CustomerId, Net FROM [Sheet1$] 
+0

시도해보십시오. 더 나아지지 않았다. – AJ17

+0

BatchSize = 1000 증가 시키십시오. –

0

Excel에서 시각적으로 비어있는 행은 여전히 ​​Excel에서 "채워진"행으로 볼 수 있습니다. ctrl-end를 치면 보통 이것을 볼 수 있습니다. 시트의 행에서 기대했던 것보다 더 아래쪽으로 끝날 것입니다. 빈 열도 같은 방식으로 작동합니다. 행 머리글을 선택하고 마우스 오른쪽 단추를 클릭 한 다음 삭제 옵션을 선택하여 이러한 행을 삭제할 수 있습니다. 단지

select * from [Sheet1$] where Net IS NOT NULL; 

에 쿼리를 광기로가는 변화 시도하지 왜

나는 그 제트 드라이버 널 (null)을 제외하기위한 올바른 구문 생각합니다.

0

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

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

일부 디버깅 및 임시 코드를 수행 한 후에 Excel에서 ExcelReader로 14 레코드 만 읽음을 발견했습니다.

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

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

모든 입력 해 주셔서 감사합니다. 대단히 감사합니다.

관련 문제