성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] How can I tell whether two programs...
[정성태] The case of the fail-fast crashes c...
[정성태] Creating Docker multi-arch images f...
[정성태] BinaryFormatter removed from .NET 9...
[정성태] Extending the Windows Shell Progres...
[우광현] 와..... 범위를 잡았으니 클라이언트가 해당 범위를 확인해본다...
[정성태] 딱히, 그것 이상으로 더 설명할 내용이 없습니다. 동적 포...
[정성태] If Windows 3.11 required a 32-bit p...
[정성태] What is a hard error, and what make...
[괴물신인] 질문작성자인데 이 글을 이제봤네요 ㄷㄷ 이 글처럼 타입별로 인...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>C# - 오피스 엑셀 97-2003 .xls 파일에 대해 32비트/64비트 상관없이 접근 방법</h1> <p> 오피스 엑셀(Excel) 구 버전의 포맷(Excel 97-2003 Workbook)으로 저장된 파일(.xls)을 C#에서 접근하려면 "Microsoft.ACE.OLEDB.12.0" 제공자를 이용해 접근하시면 됩니다.<br /> <br /> 그런데 근래의 Office 2016 제품군의 엑셀을 설치하는 경우 기본적으로 Microsoft.ACE.OLEDB.12.0 제공자는 컴퓨터에 설치되어 있지 않습니다. 따라서 다음의 경로에서 제공하는 파일을 설치해 줘야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Microsoft Access Database Engine 2010 Redistributable ; <a target='tab' href='https://www.microsoft.com/en-us/download/details.aspx?id=13255'>https://www.microsoft.com/en-us/download/details.aspx?id=13255</a> </pre> <br /> 설치 파일은 32비트(x86)와 64비트(x64)로 나뉘는데,<br /> <br /> <ul> <li>AccessDatabaseEngine.exe</li> <li>AccessDatabaseEngine_X64.exe</li> </ul> <br /> 문제는 2개를 동시에 실행할 방법이 없다는 것입니다. 왜냐하면 64비트를 설치하면 32비트 용을 설치하지 못하고, 그 반대로도 마찬가지입니다. 그나마 전에 쓴 글대로,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Access DB에 대한 32bit/64bit OLE DB Provider 관련 오류 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1036'>http://www.sysnet.pe.kr/2/0/1036</a> </pre> <br /> 64비트 용인 AccessDatabaseEngine_X64.exe를 설치한 경우 32비트 용은 "AccessDatabaseEngine.exe /passive"로 명령행에서 실행하면 2개의 환경 모두 설치가 가능합니다. (부작용이 있는데 위의 글에 덧글을 읽어보세요.)<br /> <br /> 이렇게 데이터 제공자를 설치했으면 테스트 용인 .xls 파일을 다음과 같이 만들어 주고,<br /> <br /> <img alt='ole_db_excel_1.png' src='/SysWebRes/bbs/ole_db_excel_1.png' /><br /> <br /> C#에서는 이렇게 접근할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using System; using System.Data; using System.Data.OleDb; namespace ConsoleApp1 { class Program { static void Main(string[] args) { // Console.WriteLine("Is64bit: " + Environment.Is64BitProcess); string fileName = string.Format(@"Language.xls"); string dsn = $"<a target='tab' href='https://www.connectionstrings.com/excel/'>Provider=Microsoft.ACE.OLEDB.12.0; Data Source={fileName}; Extended Properties=\"Excel 8.0;\"</a>"; using (OleDbConnection con = new OleDbConnection(dsn)) { OleDbDataAdapter da = new OleDbDataAdapter("select * from [MyDataSheet$]", con); DataSet ds = new DataSet(); da.Fill(ds, "MyDataSheet$"); ds.WriteXml(Console.Out); } } } } // 출력 결과 C:\temp\x64>ConsoleApp1.exe <NewDataSet> <MyDataSheet_x0024_> <칼럼1>2</칼럼1> <칼럼2>3</칼럼2> <칼럼3>1</칼럼3> </MyDataSheet_x0024_> <MyDataSheet_x0024_> <칼럼1>3</칼럼1> <칼럼2>2</칼럼2> <칼럼3>3</칼럼3> </MyDataSheet_x0024_> </NewDataSet> </pre> <br /> <hr style='width: 50%' /><br /> <br /> 그런데 여기서 해결하고 싶은 것은, 위의 프로그램을 AccessDatabaseEngine.exe가 설치되어 있든, AccessDatabaseEngine_X64.exe가 설치되어 있든 지에 상관없이 실행할 수 있도록 만들고 싶다는 것입니다.<br /> <br /> 이를 위해 각각의 데이터 제공자가 설치되어 있는 환경을 판단하고 이에 맞게 자신의 프로그램도 x86 또는 x64 프로세스로 실행해 주면 됩니다. 이를 위해 다음의 트릭을 사용할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C# - 하나의 바이너리로 환경에 맞게 32비트/64비트 EXE를 실행하는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11328'>http://www.sysnet.pe.kr/2/0/11328</a> </pre> <br /> 따라서 위의 환경 설정을 이번 글의 예제 코드와 결합시키면 32비트용 AccessDatabaseEngine.exe가 설치된 환경에서는 이렇게 출력 결과를 보이고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > D:\temp>x86x64test.exe Is64bit: False Checked: C:\Program Files (x86)\common files\microsoft shared\OFFICE14\ACEOLEDB.DLL <NewDataSet> <MyDataSheet_x0024_> <칼럼1>2</칼럼1> <칼럼2>3</칼럼2> <칼럼3>1</칼럼3> </MyDataSheet_x0024_> <MyDataSheet_x0024_> <칼럼1>3</칼럼1> <칼럼2>2</칼럼2> <칼럼3>3</칼럼3> </MyDataSheet_x0024_> </NewDataSet> </pre> <br /> 64비트용 AccessDatabaseEngine_X64.exe가 설치된 환경에서는 스스로 64비트 프로세스 이미지를 풀어 내고 다음과 같이 실행해 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp>x86x64test.exe Is64bit: False Checked: C:\Program Files (x86)\common files\microsoft shared\OFFICE14\ACEOLEDB.DLL Checked: C:\Program Files\common files\microsoft shared\OFFICE14\ACEOLEDB.DLL Is64bit: True Checked: C:\Program Files\common files\microsoft shared\OFFICE14\ACEOLEDB.DLL <NewDataSet> <MyDataSheet_x0024_> <칼럼1>2</칼럼1> <칼럼2>3</칼럼2> <칼럼3>1</칼럼3> </MyDataSheet_x0024_> <MyDataSheet_x0024_> <칼럼1>3</칼럼1> <칼럼2>2</칼럼2> <칼럼3>3</칼럼3> </MyDataSheet_x0024_> </NewDataSet> </pre> <br /> (<a target='tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=1175&boardid=331301885'>첨부한 파일은 이 글의 예제 프로젝트를 포함</a>합니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 이번 글은 요즘 문제가 되는 "Microsoft Excel 2007 ODBC Driver" 글을 읽고 한번 작성해 본 것입니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 10월11일자 Windows 보안 Update 후 64bit OS에서 32bit ODBC를 이용한 Excel 접근이 안됨 ; <a target='tab' href='https://social.msdn.microsoft.com/Forums/ko-KR/65bb9da3-415a-427f-9ee6-683ef4e6857d/1011-windows-update-64bit-os-32bit-odbc-excel-?forum=vistako'>https://social.msdn.microsoft.com/Forums/ko-KR/65bb9da3-415a-427f-9ee6-683ef4e6857d/1011-windows-update-64bit-os-32bit-odbc-excel-?forum=vistako</a> </pre> <br /> 참고로, 환경에 따라 다음의 KB 업데이트가 영향을 미친다고 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > windows 10 빌드 1607 - KB4041691 windows 10 빌드 1703 - KB4041676 windows 7 SP1 - KB4041681 </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1177
(왼쪽의 숫자를 입력해야 합니다.)