2007.06.20 15:17

사용자 삽입 이미지
모 건설사의 프로젝트를 하다가 보니 mdb파일을 사용자의 PC에 생성하는 부분이 필요하게 되었다.
MS Project와 상호 연동하는 부분인데 mdb파일을 통해서 일정을 상호 핸들링하는 모듈 개발이
있었다. (MS Project와 연동하는 부분도 조만간 올리도록 하겠다. .. ^^)

MS Project에서 사용하는 형식으로 mdb파일을 생성하면
생각보다 꽤많은 테이블이 들어 있고 각각의 테이블에는 엄청난 갯수의 컬럼들이 설정되어 있다.


이렇게 엄청난 수의 테이블과 컬럼을 매번 코드로 생성하는
것이 좋은 방법은 아닌 것 같아서 기본 구조를 미리 생성해서
닷넷 어셈블리의 리소스로 첨부하고 필요할 때 리소스에서
해당 파일을 생성해 내는 편이 프로그램도 간단해지고
성능에도 오히려 도움이 될 것이라는 생각이 들었다.

리소스에 첨부될 수 있는 파일의 종류는
제한이 없다. 필요하다면 어떤 파일이라도 첨부할 수 있다.
이를 잘 활요하면 엑셀이나 워드도 포함시킬 수 있기
때문에 다양한 활용이 가능하다.









1.아래 그림에서 처럼 리소스를 추가 시키려고 하는 프로젝트에서 찾기쉽게 적당한 폴더를 만들고
폴더에서 오른쪽 마우스 버튼을 클릭해서 추가->기존 항목 추가 를 선택해서 추가할 파일을
선택한다.

사용자 삽입 이미지
 
위의 과정을 거치면서 파일을 프로젝트에 추가했지만 아직 어셈블리 안에 함께 포함되지는
않는데 추가시킨 파일의 속성에서 빌드 작업을 포함 리소스로 수정해 두어야한다.
여기까지 하면 프로젝트에 포함된 파일은 빌드작업시에 어셈블리내의 리소스로 함께 포함되어서
배포되게 된다.
사용자 삽입 이미지

이제 포함된 리소스를 가지고 원래 파일로 복원하는 방법을 설명하자면
리소스로 포함된 파일의 바이너리 형태의 스트림을 가지고 와서 로컬에 직접 써주기만 하면 파일로
복원이 가능하다.

//리소스에 포함된 내용을 가져와서 로컬에 파일로 복원시키는 코드
using (BinaryReader reader = new BinaryReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("LEC.Win.PL.CPNetworkPlan.Resources.Sample_Project.mdb")))
{
      using (BinaryWriter writer = new BinaryWriter(new FileStream("C:\\temp\\" + cdhSiteCode.Text + ".mdb", FileMode.Create)))
      {
            int count = (int)reader.BaseStream.Length;

            byte[] butter = reader.ReadBytes(count);

            writer.Write(butter);
         }
    }

위의 소스 중에서 특히 아래부분을 주의해야 한다.
GetManifestResourceStream("LEC.Win.PL.CPNetworkPlan.Resources.Sample_Project.mdb")
스트림으로 가져올 리소스의 namespace를 정확하게 기술해 주지 않으면
절대로!!! 동작하지 않는다. ^^


-------------------------------------------------------
김영욱 Microsoft
MVP 2006~2007
-------------------------------------------------------
Email:
iwinkey@hotmail.com
Blog: winkey.tistory.com
Phone: 016-817-0063
www.winkey.pe.kr
www.vismuri.com
-------------------------------------------------------

신고