FIX: ADO 데이터 Excel에서 잘못 된 열에 삽입

만료된 KB 콘텐츠 고지 사항

이 문서는 Microsoft에서 더 이상 지원하지 않는 제품에 대해 작성되었습니다. 따라서 이 문서는 “있는 그대로" 제공되며 더 이상 업데이트되지 않습니다.

증상

데이터에는 빈 문자열 값이 들어 있는 필드가 포함 된 경우 Microsoft Excel 워크시트에 새 데이터 행을 삽입 하려면 ADO를 사용 하는 경우 ADO는 Excel에서 잘못 된 열에 후속 숫자 필드의 데이터 값을 삽입 합니다.


Microsoft Excel ODBC 드라이버와 Microsoft OLE DB 공급자를 Jet 버전 4.0에서이 문제가 발생합니다. 이 문제는 삽입 하는 SQL 문 또는 AddNew 및 ADO 레코드 집합 개체의 Update 메서드를 사용 하는 여부를 발생 합니다.


ADO 새 레코드를 삽입할 때 Excel 통합 문서는 Excel 응용 프로그램에서 열려 있으면이 문제가 발생 하지 않습니다.


그러나 Microsoft ADO 작업 하는 동안 Excel이 열려 있으면 메모리 누수가 발생 하기 때문에이 이렇게 수 없게 됩니다.
자세한 내용은 아래 Microsoft 기술 자료의 다음 문서 번호를 클릭하여 참조하십시오.

319998 버그: ADO 사용 하 여 워크시트를 Excel 열려 쿼리할 때 메모리 누수가 발생
이 문제가 발생 하는 상황에 대 한 자세한 내용은 "추가 정보" 단원을 참조 하십시오.

해결 방법

이 문제를 해결 하려면 Jet 4.0 서비스 팩에 대 한 최신 서비스 팩을 구하십시오. 자세한 내용은 다음 문서 번호를 클릭하여 Microsoft 기술 자료에서 해당 문서를 확인하십시오.
239114 방법: Jet 4.0 데이터베이스 엔진용 최신 서비스 팩을 얻으려면

상태

Microsoft는이이 문서의 시작 부분에 나열한 제품에서 버그는 확인 했습니다.

자세한 내용

문제를 재현 하기 위한 단계

  1. Microsoft Excel을 열고 새 통합 문서를 만듭니다.
  2. Sheet1의 왼쪽된 위 모퉁이에 있는 셀 a 1부터 다음 예제 데이터를 입력 합니다.
    ColumnAColumnBColumnCColumnDColumnEColumnF
    11테스트11테스트
    22테스트22테스트

  3. Test.xls 문서로 저장 합니다. Excel 응용 프로그램은 열어둘 수 있지만 새 통합 문서를 닫아야 합니다.
  4. Microsoft Visual Basic 새 표준 EXE 프로젝트를 만듭니다. Form1이 기본적으로 만들어집니다.
  5. 프로젝트 메뉴에서 참조를 클릭 합니다. 사용 가능한 참조 목록에서 Microsoft ActiveX 데이터 개체 2 를 선택 합니다. x 라이브러리.
  6. Form1에 CommandButton 컨트롤을 추가 하 고 단추의 Click 이벤트 프로시저에 다음 코드를 붙여넣습니다. 참고가이 코드 C. 열은 중간 열에 빈 문자열을 삽입
    Private Sub Command1_Click()   Dim strCn As String
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim fld As ADODB.Field

    'Open connection
    strCn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & App.Path & "\Test.xls;" & _
    "Extended Properties=Excel 8.0"
    Set cn = New ADODB.Connection
    cn.Open strCn

    'Add new values.
    Set rs = New ADODB.Recordset
    With rs
    .CursorLocation = adUseClient
    .Open "Select * from [Sheet1$]", cn, adOpenStatic, adLockOptimistic
    .AddNew
    .Fields("ColumnA").Value = 3
    .Fields("ColumnB").Value = 3
    .Fields("ColumnC").Value = ""
    .Fields("ColumnD").Value = 3
    .Fields("ColumnE").Value = 3
    .Fields("ColumnF").Value = "testing"
    .Update
    .Close
    End With
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
    End Sub

  7. Visual Basic 테스트 프로젝트를 Test.xls 통합 문서와 같은 폴더에 저장 합니다.
  8. 프로젝트를 실행 하 고 단추를 클릭 합니다. 프로젝트를 실행 하면 Visual Basic 통합 개발 환경 (IDE)에서 처음으로 다음과 같은 오류 메시지가 나타날 수 있습니다.
    런타임 오류 '-2147467259 (80004005)': 선택한 데이터 정렬 시퀀스를 운영 체제에서 지원 되지 않습니다
    이는 알려진 문제입니다. 대 한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조 하려면 아래 문서 번호를 클릭:

    246167 정렬 순서 여 ADODB Recordset 오류 Excel XLS에 대해 처음으로
  9. 오류 메시지 대화 상자에서 디버그를 클릭 하 고 계속 프로젝트를 실행 하려면 F5 키를 누릅니다. 업데이트 두 번 실행 되기 때문에 데이터 하나 대신 두 개의 새로운 행 삽입이 note입니다.
  10. 프로젝트 종료 폼을 닫습니다. Test.xls Excel에서 다시 열 한 다음 Sheet1 데이터를 검사 합니다. 다음과 같은 결과가 예상한:

    ColumnAColumnBColumnCColumnDColumnEColumnF
    11테스트11테스트
    22테스트22테스트
    3333테스트

    그러나 다음 데이터를 볼 수 있습니다.

    ColumnAColumnBColumnCColumnDColumnEColumnF
    11테스트11테스트
    22테스트22테스트
    3333테스트

    ColumnC에 삽입 된 빈 문자열이 무시 되었습니다 및 나타나지 않는 처럼 나타납니다. 따라서 모든 후속 숫자 값은 의도 된 대상의 왼쪽에 삽입 된 한 열. 후속 문자열 열 영향을 받지 않습니다.

변형 1

테스트 데이터를 다음과 같이 구성 합니다.

ColumnAColumnBColumnCColumnDColumnE
1테스트11테스트
2테스트22테스트

Visual Basic 프로젝트에서 다음과 같은 새 값을 추가 하려면 섹션을 수정 합니다.
   'Add new values.   Set rs = New ADODB.Recordset
With rs
.CursorLocation = adUseClient
.Open "Select * from [Sheet1$]", cn, adOpenStatic, adLockOptimistic
.AddNew
.Fields("ColumnA").Value = 3
.Fields("ColumnB").Value = ""
.Fields("ColumnC").Value = 3
.Fields("ColumnD").Value = 3
.Fields("ColumnE").Value = "testing"
.Update
.Close
End With
Set rs = Nothing
cn.Close
Set cn = Nothing

Excel에서 Test.xls를 열 때 다음 데이터 Sheet1에 표시 됩니다.

ColumnAColumnBColumnCColumnDColumnE
1테스트11테스트
2테스트22테스트
333테스트

단일 숫자 열에 빈 문자열 값 앞에 때이 문제가 발생 하지 않습니다 확인 합니다.

변형 2

테스트 데이터를 다음과 같이 구성 합니다.

ColumnAColumnBColumnCColumnDColumnEColumnFColumnG
11테스트테스트11테스트
22테스트테스트22테스트

Visual Basic 프로젝트에서 다음과 같은 새 값을 추가 하려면 섹션을 수정 합니다.
   'Add new values.   Set rs = New ADODB.Recordset
With rs
.CursorLocation = adUseClient
.Open "Select * from [Sheet1$]", cn, adOpenStatic, adLockOptimistic
.AddNew
.Fields("ColumnA").Value = 3
.Fields("ColumnB").Value = 3
.Fields("ColumnC").Value = ""
.Fields("ColumnD").Value = ""
.Fields("ColumnE").Value = 3
.Fields("ColumnF").Value = 3
.Fields("ColumnG").Value = "testing"
.Update
.Close
End With
Set rs = Nothing
cn.Close
Set cn = Nothing

Excel에서 Test.xls를 열 때 다음 데이터 Sheet1에 표시 됩니다.

ColumnAColumnBColumnCColumnDColumnEColumnFColumnG
11테스트테스트11테스트
22테스트테스트22테스트
3333테스트

빈 문자열 값을 두 개 삽입 하는 ADO ColumnD ColumnC에 삽입 된 빈 문자열이 무시 되 고 사라진 것 처럼 나타납니다. 따라서 모든 후속 숫자 값은 의도 된 대상의 왼쪽에 삽입 된 두 개의 열. 후속 문자열 열 영향을 받지 않습니다.

참조

자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조 하려면 아래 문서 번호를 클릭 합니다.

294410 ACC2002: Excel로 내보낼 때 다음 필드는 데이터 Null 대체
257819 방법: ADO를 사용 하 여 Visual Basic 또는 VBA에서 Excel 데이터를 사용 하 여
속성

문서 ID: 314763 - 마지막 검토: 2017. 2. 7. - 수정: 1

피드백