Programming/MFC

Excel Driver 사용한 CDatabase 오류

acidpop 2017. 10. 20. 10:31
반응형


MFC 중 CDatabase 를 이용하여 Excel 파일을 컨트롤 할 수 있는 기능이 있다.

 


 

CDatabase  database;

CString  sDriver = _T("MICROSOFT EXCEL DRIVER (*.XLS)");
CString  sExcelFile = "xls 파일 전체 경로";

CString  sSql;
CString  strError;

 

 

 

sSql.Format(_T("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"), sDriver, sExcelFile, sExcelFile);
if(database.OpenEx(sSql, CDatabase::noOdbcDialog))
{
 
 sSql.Format(_T("SELECT * FROM [%s$A1:IV65536]"), "Address");

 


 

 

위와 같은 방법으로 xls 파일을 읽어 엑셀 데이터를 사용 할 수 있는데 2017년 10월 중순쯤부터 갑자기 오류가 나기 시작한다.

 

-5016

FIRSTROWHASNAMES\

잘못된 연결 문자열 특성입니다

 

 

뭐 위와 같은 내용의 에러 메시지가 보이게 된다.

 

 

구글링을 해보니 msexcl40.dll 파일이 업데이트 되면서부터 발생한 문제로 보인다.

 

문제가 발생하는 msexcl40.dll 의 버전은 4.0.9801.1 버전이고 크기는 345,088 byte 이다.

 

가장 좋은 방법은 KB4041681 업데이트를 제거 하는 방법이 있다.

 

하지만 최근 Windows 10 RS3 로 업데이트 하였다면 KB4041681 업데이트가 보이지 않는다.

 

이럴때는 msexcl40.dll 파일을 문제가 발생하지 않는 4.0.9801.0 버전으로 변경을 해주어야 하는데

 

이 파일은 특별한 권한이 있지 않는 이상 덮어쓰기가 되지 않는다.

 

msexcl40.dll 4.0.9801.0 버전 파일을 구하여 접근 가능한 경로에 파일을 복사 해둔다.

 

그리고 나서 레지스트티 편집기 (regedit.exe) 를 실행한다.

 

\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Jet\4.0\Engines\Excel

 

위 경로로 이동한 다음 Win32 라는 키의 값을 보면

 

C:\Windows\SysWOW64\msexcl40.dll

 

이렇게 되어 있는데 이 앞쪽 경로를 msexcl40.dll 4.0.9801.0 버전 파일이 있는 경로로 변경해준다.

 

예를 들어 D 드라이브의 Driver 라는 경로에 msexcl40.dll 이 존재 한다면

 

d:\driver\msexcl40.dll

 

위와 같이 변경해 주면 된다.




혹여 파일이 필요하신 분들은 아래 파일을 사용.


msexcl40.dll  - 4.0.9801.0


msexcl40.zip


파일에 의심이 되시는 분들은c:\windows 에서 msexcl40.dll 을 검색해보시면 


여러 파일들이 검색이 되는데 이 중 크기가 다른 파일 또는 날짜가 다른 파일이 검색이 된다면 해당 파일의 속성을 클릭하여 버전 확인 후 


4.0.9801.0 버전 파일을 복사하여 사용하면 된다.



 

https://support.microsoft.com/ko-kr/help/4042007/description-of-the-security-update-for-the-microsoft-jet-database-engi

 

 

https://social.technet.microsoft.com/Forums/en-US/55b1d633-b715-491e-917e-b7cb01ae0523/error-in-windows-update-kb4041681-unexpected-error-from-external-database-driver-1?forum=sqldataaccess

 

 





만약 프로그램의 소스를 수정 할수 있는 상황 이라면 다음과 같이 코드를 수정 하면 작동 한다.



 

CDatabase  database;

//CString  sDriver = _T("MICROSOFT EXCEL DRIVER (*.XLS)");

CString  sDriver = _T("Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)");

CString  sExcelFile = "xls 파일 전체 경로";

CString  sSql;
CString  strError;

 

 

 

sSql.Format(_T("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"), sDriver, sExcelFile, sExcelFile);
if(database.OpenEx(sSql, CDatabase::noOdbcDialog))
{
 
 //sSql.Format(_T("SELECT * FROM [%s$A1:IV65536]"), "Address");

 sSql.Format(_T("SELECT * FROM [%s$]"), "Address");





반응형