티스토리 뷰

반응형

SQL DB 파일을 윈도우 폰에 배포를 해야해서, 찾아보게 되었다. 여기 저기 이것 저것 만은 내용이 있었는데 그 중에 한가지 방법에 대해서 소개 한다.


1. Mango Samples: SQL Toolbox (http://blog.jerrynixon.com/2011/11/in-recent-posts-i-discussed-two-ways-to.html)
포스트에 따르면, 로컬 데이터페이스를 윈도우 폰에 배포하기 위한 방법으로는
1) code-first를 이용해서 격리 저장소에 db를 생성하는 방법
2) SQL Metal을 이용해서 클래스를 만들고 데이터를 만드는 방법
3) SQL Server Compact Toolkit을 이용해서 만드는 방법
이렇게 3가지가 있다고 한다.


2. 여기서는 3)째 방법에 대해서 알아보도록 하자.
일단 SQL SERVER COMPACT TOOLBOX를 설치를 해야한다. Nuget으로 검색해서 설치를 하라고 하는데..Nuget에서는 찾지 못했다. 그래서 직접 다운로드를 받기로 했다.
http://visualstudiogallery.msdn.microsoft.com/0e313dfd-be80-4afb-b5e9-6e74d369f7a1?SRC=VSIDE
다운로드 받을 수 있는 곳이다. 다운로드를 받은 후에 어떤 작업을 해야하는지는 동영상으로 자세히 설명해 주고 있다.


3. 동영상에서 중요한 것은 SqlCE3.5만 가능하다는 것이다. DB를 만들어서 Windows Phone 7 Project에 추가하고,
* SQL Server Compact Toolbox 윈도우를 열고(Tool 메뉴 아래 추가 되어 있다.)

* Add SQL Server Compact 3.5 Connection ( 새로 고침을 해도 뜬다)

* 추가된 Database file에서 오른쪽 마우스를 눌러서 Add Windows Phone DataContext to current Project...을 선택해서
DB 파일의 구조대로 클래스를 만들어 준다.

* 추가된 클래스를 이용해서 Windows Phone 7에서 작업을 하면된다.

4. 블로그 작성자는 요기 까지만 알려줬다. 음 윈도우 폰에서 어떻게 작업을 하는가?
셈플 프로젝을 만들어 봤다.

LocalDB35.sdf라는 파일을 만들고, 한개의 테이블을 추가한 후 4개 정도의 데이터를 입력했다.
그리고, 윈도우 폰 프로젝트에 추가한 후 위의 내용대로 따라서 했더니 LocalDB35Context.cs라는 파일이 Root에 생성됐다.

LocalDB35Context.cs 소스 코드 중 중요한 부분은 바로 아래 코드 이다.

 public static string ConnectionString = "Data Source=isostore:/LocalDB35.sdf";
 
 public static string ConnectionStringReadOnly = "Data Source=appdata:/LocalDB35.sdf;File Mode=Read Only;";
 
윈도우 폰 프로젝트에서 db의 내용을 조회만 할 것이라면 ConnectionStringReadOnly라는 연결 문자열을 사용해서 연결을 하면 되고,  읽기, 쓰기, 수정 등의 작업을 하기 위해서는 ConnectionString이라는 문자열을 사용하면 된다. 그런데, 각 각의 파일 위치가 다른 것을 알 수 있다. 읽기만 하는 경우에는 xap파일에 포함되어 있는 db파일을 바로 연결해서 사용하지만, 수정이 되어야 하는 경우에는 격리 저장소를 이용해야 하는 것이다.

5. MainPage.xaml

        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <ListBox x:Name="lbPerson" DisplayMemberPath="Name"/>
        </Grid>
리스트 박스 컨트롤 하나 추가6. MainPage.xaml.cs    public partial class MainPage : PhoneApplicationPage
    {        //읽기 전용
        LocalDB35Context context = new LocalDB35Context(LocalDB35Context.ConnectionStringReadOnly);
 
        // Constructor
        public MainPage()
        {
            InitializeComponent();
 
            lbPerson.ItemsSource = context.Person;
        }
    }

6. 실행실행하면 미리 입력해 놓았던 데이터를 조회해서 화면에 출력하는 것을 알 수 있다.


7. 격리 저장소에서 읽어 오기

    public partial class MainPage : PhoneApplicationPage
    {
        //격리 저장소에서 읽어 오기
        LocalDB35Context context = new LocalDB35Context(LocalDB35Context.ConnectionString);
 
        // Constructor
        public MainPage()
        {
            InitializeComponent();
 
            lbPerson.ItemsSource = context.Person;
        }
    }


8. 실행한다.실행하면 {"The database file cannot be found. Check the path to the database. [ Data Source = \\Applications\\Data\\186AB724-6C44-4F13-8B36-9418B236161B\\Data\\IsolatedStore\\LocalDB35.sdf ]"}이런 오류 메시지를 보게 될 것이다. 왜냐하면, 격리 저장소에 db file을 만드는 작업이 필요한데, 그런 작업을 한적이 없기 때문이다. 위에서 사용한 코드를 수정해 보자.   

public partial class MainPage : PhoneApplicationPage
    {
        //격리 저장소에서 읽어 오기
        LocalDB35Context context = new LocalDB35Context(LocalDB35Context.ConnectionString);
 
        // Constructor
        public MainPage()
        {
            InitializeComponent();
            //격리 저장소에 데이터 베이스가 존재하지 않는 경우 새로 만든다.
            context.CreateIfNotExists();
            lbPerson.ItemsSource = context.Person;
        }
    }

9. 다시 실행


정상적으로 실행 되었다. 그런데 왜 빈 화면일까?  새로만들어진 db에는 데이터가 없기 때문이다. 격리 저장소에 데이터를 넣는 것은 개발자의 몫이다.

격리 저장소에 만들어진 파일은 이전 포스트의 Isolated Storage Explorer를 이용하면 확인이 가능하다.

LocalDB.zip
다운로드

반응형
댓글