메모리 기반에서 자료를 다루기 위해 Array나 Linked List 그리고 Hashmap 등을 사용하지만, 대용량 또는 SQL 문을 통한 다양한 조건검색을 위해 DBMS을 사용해야할 때가 있습니다. 설치도 필요없고 가볍고 빠르게 사용할 수 있는 Local DBMS로 SQLite는 안드로이드나 SVN 등과 같이 매우 광범위하게 사용되는데.. C#으로 이 SQLite를 다루는 내용에 대해 정리를 해 봅니다.
C#에서 SQLite를 사용하기 위해서는 먼저 .NET용 SQLite 어셈블리 모듈을 설치해야 합니다. SQLite 공식 사이트에서 관련 파일을 설치할 수 있는 setup 파일을 받아 설치하기 바랍니다.
개발을 위해 필요한 파일이 설치되면 Visual Studio에서 C# 프로젝트를 생성하고 아래의 화면처럼 어셈블리 참조를 추가해 줍니다.
위의 화면에서 추가한 System.Data.SQLite 참조는 SQLite를 위한 ADO.NET 데이터 제공자(Data Provider)입니다. 이 참조는 앞서 설치된 폴더에 System.Data.SQLite.dll 파일을 통해 추가할 수 있습니다.
참조를 추가했으므로 코드에서 참조와 관련된 클래스를 빠르게 접근하기 위한 아래의 using 문을 추가합니다.
using System.Data.SQLite;
이제 다음과 같은 폼을 디자인함으로써 SQLite에 대한 주요 내용에 대한 코드를 살펴 보겠습니다.
폼 상에 버튼의 제목을 통해 우리가 파악할 SQLite에 대한 코드가 무엇인지 짐작할 수 있습니다. 즉, 아래와 같습니다.
- Create DB File – SQLite DB 파일을 생성합니다.
- Open DB – 생성한 DB 파일을 사용하기 위해 연결합니다.
- Create Table – DB 파일에 테이블을 생성합니다.
- Insert Row – 생성한 테이블에 Row를 추가합니다.
- Query Data – 테이블에 저장된 데이터를 조회합니다.
- Close Connection – DB 파일에 대한 연결을 닫습니다.
먼저 SQLite DB 파일을 생성하는 버튼에 대한 코드는 다음과 같습니다.
SQLiteConnection.CreateFile("c:/a.sqlite");
위의 코드가 성공한다면 C:\ 경로에 a.sqlite라는 파일이 생성될 것입니다. 다음은 생성한 DB 파일을 사용하기 위해 연결하는 코드입니다.
conn = new SQLiteConnection("Data Source=c:/a.sqlite;Version=3;"); conn.Open();
위의 코드에서 conn 변수는 다음과 같이 정의되어 있습니다.
private SQLiteConnection conn = null;
이제 다음은 DB 파일에 테이블을 생성하는 코드입니다.
string sql = "create table members (name varchar(20), age int)"; SQLiteCommand command = new SQLiteCommand(sql, conn); int result = command.ExecuteNonQuery(); sql = "create index idx01 on members(name)"; command = new SQLiteCommand(sql, conn); result = command.ExecuteNonQuery();
우리가 흔히 알고 있는 CREATE SQL 문을 통해 테이블을 생성하고 있습니다. 추가적으로 인덱스(INDEX)까지도 생성하고 있습니다. 이제 다음은 생성한 테이블에 Row를 추가하는 코드입니다.
String sql = "insert into members (name, age) values ('김도현', 6)"; SQLiteCommand command = new SQLiteCommand(sql, conn); int result = command.ExecuteNonQuery();
아.. 우리 와이프 코고는 소리가 들리네요.. -_-; 여튼.. 위의 코드를 보면 Row를 추가하기 위해 흔히 알고 있는 INSERT SQL문을 사용하고 있습니다. 다음은 테이블에 저장된 데이터에 대한 조회 코드입니다.
String sql = "select * from members"; SQLiteCommand cmd = new SQLiteCommand(sql, conn); SQLiteDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { MessageBox.Show(rdr["name"] + " " + rdr["age"]); } rdr.Close();
SELECT SQL문을 통해 조회할 수 있으며, SQLiteDataReader 클래스를 통해 실제 조회된 데이터를 필드별로 읽어 낼 수 있는 것을 볼 수 있습니다. 이제 끝으로 DB에 연결된 Connection 객체를 닫는 코드는 아래와 같습니다.
conn.Close();
자, 이상으로 요긴하게 바로 사용할 수 있는 Local DBMS인 SQLite를 C#에서 사용할 수 있는 최소한의 내용을 정리해 보았습니다.
글쓴이님의 깔끔한 정리와 세세한 설명으로 쉽게 따라할 수 있었습니다. 저같은 초보자가 찾던 딱 알맞은 글입니다. 좋은 글 감사합니다! 좋은 하루 되세요!
정말 잘 봤습니다.
제가 찾던 딱 그내용이네요.
제 프로젝트에는 SqlServer 익스프레스를 썼는데 바꿔야겠어요.
정말 최고에요!!
“아.. 우리 와이프 코고는 소리가 들리네요.. -_-; 여튼.. ”
이 부분에서 뿜었습니다.ㅋㅋㅋ 일하는 중 큰 웃음 주셔서 감사합니다~ ^0^
인간적인 포스팅 멋있네요!
깔끔한 정리 잘봤습니다
혹시 DB 파일을 사용하기위한 코드중 Version=3 는 무엇을 뜻하나요 ? 어떤 버전을 참고해야해야하나요?
SQLite의 버전을 의미합니다.
안녕하세요 깔끔한 정리 감사드립니다.
다만 여쭤볼 점이
테이블의 정보를 읽어와서 동적으로 리스트 뷰를 생성하는 프로그램을 만들고 있는데
rdr.Read()를 사용할 때, 테이블의 컬럼 명은 받아올 수 없는것이고 꼭 지정해 줘야 하는건지
질문드립니다
안녕하세요~ 저 역시 가능 여부는 해당 코드를 실행해봐야 알듯합니다.
요 근래에 보고 참고했던 인터넷 글 중 젤 이해 잘되게 쓰신 거 같아요!! 덕분에 개념 잘 잡고 갑니다~!
댓글 감사합니다 ^^
안녕하세요. 구글링을 하다가하다가 도저히 해결 방법을 못 찾아서 이렇게 댓글로 조언을 구합니다.
c#으로 sqlite 와 연동하는 코드를 작성했는데 sqlite db를 네트워크 폴더에 저장 하여 사용 하려고 하니 계속 경로를 못 찾는 것 같습니다. 제 컴퓨터에 매핑된 경로로는 접근이 가능한데 매핑된 경로로 코드를 작성해서 배포 하면 다른 컴퓨터에서는 또 접속이 안되어서 매핑이 안된 경로로 작성해야 하는데 계속 경로를 못 찾네요ㅠㅠ 방법이 없을까요?
string databasePath = @”\Diskstation\DATA\DB\inspection”; // 연결 안됨
string databasePath = @”v:DB\inspection”; //연결됨
안녕하세요. sqlite가 네트워크 경로를 인식하지 못하는거 아닐까요? 사실 sqlite의 목적은 personal db입니다.