[C#] SQLite3 사용법

Posted on 2012/04/07 by in C#, SQLite3

사용환경

  • 운영체제 : Microsoft Windows 7 Ultimate K SP1
  • 개발환경 : Microsoft Visual Studio 2010
  • 프레임워크 : Microsoft .NET Framework 4.0
  • SQLite3 버전 : SQLite 3.7.11

01. 시작하기 전에…

지난 번에 포스팅했던 SQLite3 설치 및 간단한 사용법에 이은 포스팅입니다. 지난 번에는 SQLite의 간단하게 사용해봤는데 이제는 실제로 C#에서 사용해보려고 합니다. 이 포스팅의 핵심은 필요한 SQLite의 dll 파일만 같이 배포하면 .NET 4.0 환경에서 추가적인 소프트웨어 설치가 필요없이 SQLite의 기능을 사용하는 것입니다.

02. ADO.NET 2.0 Provider for SQLite 설치

 ADO.NET 2.0 Provider for SQLite의 홈페이지에 접속해서 설치파일을 다운받습니다.

제가 다운받아서 설치를 한 파일은 SQLite-1.0.66.0-setup.exe입니다. 설치과정은… 저도 잘 몰라서 그냥 Next, Next 날렸습니다. 그다지 뭐 특별한 옵션같은 것도 없었던 것 같아서 따로 설명하지 않도록 하겠습니다.(아… 원래 이렇게 생략하고 하는거 별로 안 좋아하긴 하지만 스크린샷 작업이 만만치 않은지라…ㅡㅡ;;)

03. 프로젝트 생성

이제 Visual Studio 2010에서 프로젝트를 만들어보도록 하겠습니다.

이제부턴 SQLite를 실제로 사용이 가능한 것인지 테스트를 위한 프로젝트를 만들어서 작업하려고 합니다. Windows Form 응용 프로그램 프로젝트를 SQLiteDLLTestProj라는 이름으로 만듭니다.(뭐… 나머지는 프로젝트이름은 편한대로 만드셔도 관계없습니다.)

구성요소는 아래와 같습니다.

  • Label
    • Name : lbDBPath
    • Text : DB Path :
  • TextBox
    • Name : tbDBPath
  • Button
    • Name : btnDBPath
    • Text : …
  • Button
    • Name : btnOpenDBFile
    • Text : Open SQLite3 Database File
  • DataGridView
    • Name : dgvTable

뭐… 복잡한 것은 없습니다. 이 장난감같은 프로그램의 목적은 “단지 SQLite 데이터파일을 열어서 t1이라는 테이블의 데이터를 조회하여 그리드에 출력하는 것“입니다.

이렇게 장난감같은 샘플코드를 만들어보는 이유는 실제로 프로그램 배포 시에 실행파일과 SQLite의 DLL 파일만을 배포하면 문제없이 사용할 수 있다는 것을 검증하기 위한 작업인 것입니다.

그 것이 검증이 된다면, 추후에 보다 복잡한 작업을 망설임없이 실행하겠죠.

04. System.Data.SQLite 참조추가

이제는프로젝트에 SQLite의 DLL을 추가해보도록 하겠습니다.

앞서서 ADO.NET 2.0 Provider for SQLite를 설치해야 참조로 추가할 수 있습니다.

이제 거의 성공적으로 준비가 완료됬습니다. 자~ 이제부터 코딩 시~작!

05. 코딩

이제 아주 간단한 작업을 시작해보려고 합니다. 아래는 MainForm.cs 파일의 내용입니다.(아… 기존에 Form1.cs 파일은 MainForm.cs로 파일명을 변경하여 진행했습니다.)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
<span style="color: #ff0000;"><strong>using System.Data.SQLite;</strong></span>
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SQLite3DLLTestProj
{
    public partial class MainForm : Form
    {
        <span style="color: #ff0000;"><strong>string dbConnection; </strong></span><strong style="color: #ff0000;"> DataTable dt;</strong>
        public MainForm()
        {
            InitializeComponent();
            <span style="color: #ff0000;"><strong>dt = new DataTable();</strong></span>
        }
        private void <strong>btnDBPath_Click</strong>(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "SQLite3 Database Files|*.db|All Files|*.*";
            ofd.FilterIndex = 1;
            ofd.RestoreDirectory = true;
            try
            {
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    this.tbDBPath.Text = ofd.FileName;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("File Open Error :n" + ex.Message);
            }
        }
        private void <strong>btnOpenDBFile_Click</strong>(object sender, EventArgs e)
        {
            this.dbConnection = String.Format("Data Source={0}", this.tbDBPath.Text);
            try
            {
                SQLiteConnection cnn = new SQLiteConnection(dbConnection);
                cnn.Open();
                SQLiteCommand sqlcmd = new SQLiteCommand(cnn);
                sqlcmd.CommandText = "select * from t1;";
                SQLiteDataReader reader = sqlcmd.ExecuteReader();
                this.dt.Load(reader);
                this.dgvTable.DataSource = dt;
                reader.Close();
                cnn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("SQLite3 Database Connection Error :n" + ex.Message);
            }
        }
    }
}

소스의 내용은 아주 간단합니다. ““라는 btnDBPath 버튼을 클릭하면 FileOpenDialog를 열어서 DB파일을 선택합니다. 선택한 DB파일의 전체경로 및 파일명은 tbDBPath인 텍스트박스에 저장합니다.

그 이 후에 “Open SQLite3 Database File“버튼을 클릭하면 tbDBPath로 지정한 db파일을 열어서 쿼리를 실행한 다음 그 결과를 DataTable에 저장합니다. 그리고 마지막으로 DataTable 객체를 DataGridView 컨트롤의 DataSource로 지정합니다. 그럼 DataGridView에 테이블의 내용이 조회되어 출력됩니다.

06. 빌드 및 실행

코드작업이 완료되었으면 이제 개발환경이 아닌 다른 일반적인 환경에서도 동일하게 실행되기 위해서 추가적인 셋팅이 필요합니다.

솔루션 탐색기에서 System.Data.SQLite를 오른쪽으로 클릭해서 속성을 선택합니다.

개발환경이 아닌 다른 일반적인 환경에서 ADO.NET 2.0 Provider for SQLite를 설치할 것이라면 관계없지만… 그런 번거로운 일을 피하고 싶다면, 위 처럼 해당 참조의 Local Copy(로컬 복사)의 속성 값을 True로 변경합니다.

변경한 후에는 F5버튼을 눌러서 Compile & Debugging을 시작합니다. 혹시 소스의 오타가 있거나 문제가 있다면 수정합니다.

“버튼을 클릭해서 db파일을 선택합니다.(db파일은… 지난 포스트에서 작업했던 파일입니다.) 그 후에 “Open SQLite3 Database File“버튼을 클릭해서 실행합니다.

07. 알 수 없는 오류…

문제는 여기에서 발생합니다. 실행하면 대체 알 수 없는 오류가 발생합니다.

여기에서 계속 엄청나게 해맸습니다… 검색에 검색을 한 이 후에 해결할 수는 있었습니다.

App.config 파일을 추가해야합니다.

이제 파일을 추가했으니 내용을 추가해야합니다.

&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;configuration&gt;
    &lt;startup useLegacyV2RuntimeActivationPolicy="true"&gt;
        &lt;supportedRuntime version="v4.0"/&gt;
    &lt;/startup&gt;
&lt;/configuration&gt;

정확한 내용은 모르나 .NET 프레임워크 4.0의 DLL과 기존 DLL간의 혼합사용이 기본적으로는 불가하도록 되어있나봅니다. 그런데 그런 사용이 가능하도록 하는 것이 App.config 파일에 위에 빨간색으로 표시한 부분인 것 같습니다.

이제 다시 빌드하면 문제없이 실행이 가능합니다.

이제는 실제로 dll 파일과 실행파일만으로 개발환경이 아닌 일반환경에서 동작하는지 테스트할 차례입니다.

08. 테스트

이제는 VisualStudio를 끄고 실행파일과 기타 파일만으로 테스트를 진행해보려고 합니다. 솔루션이 위치한 디렉토리에서 빌드결과로 나온 실행파일과 설정파일만으로 테스트를 진행해보려고 합니다.

정말 많은 파일들이 있는데… 제 생각으로는 다 필요한 것 같지 않아서 이것저것 지워보면서 테스트를 해봤습니다.

직접 개발환경이 설치되지 않은… VisualStudio도 설치되지 않은 PC(Windows 7)에서 테스트를 진행해보니 위의 3개의 파일만 있으면 실행에 문제가 없더군요. 아마 배포 시에 해당 파일만 온전히 배포한다면 문제없이 타겟환경에서도 개발환경과 동일하게 실행이 가능할 것 같습니다.

09. 마치면서…

이제는 슬슬 필요한 기능들을 하나씩 만들어볼려고 합니다. 현재는 쿼리문의 경우에도 코드 내에 하드코딩되어 있지만 보다 일반화하고 필요한 경우에는 특정 모듈로 만들어볼까합니다.

일단 현재 계획으로는 앞으로 제가 취미삼아 만들 장남감 프로젝트의 모든 설정파일을 SQLite DB파일을 이용해서 만들 생각입니다. 스터디 목적의 프로젝트이므로 빠르게 진척되진 않을 것이지만 진척되는 만큼씩 블로그에 그 과정과 결과를 공유할 생각입니다.

아래는 실제 테스트를 위해서 소스코드와 db파일을 공유합니다.

10. 참고문서

  1. http://www.dreamincode.net/forums/topic/157830-using-sqlite-with-c%23/
  2. http://westzero.net/105