DataBase

[Sqlite] 간단 Source

izen8 2011. 4. 14. 15:30
반응형

1. Overview

 

특징

- 환경 설정이 필요 없다

 => 사용하기전에 별다른 절차가 필요없다. 그리고 소스코드를 컴파일해서 라이브러리를 사용할 수도 있다.

- 끼워 넣기 좋다.

 => 어플리케이션에 이식하기 좋다.

- 어플리케이션 인터페이스

 => C 어플리케이션에서 데이터베이스를 다루기위한 환경을 제공한다.

- 트랜잭션 제공

- 쓰레드 안정적

- 가볍다

- 사용자에 맞게 변경이 용이하다.

- 크로스 플랫폼 지원

 

1.1. 샘플 어플리케이션들

 

1.1.1. 간단한 SQLite 어플리케이션

 

[소스]

 

#include <stdio.h>

#include "../sqlite/inc/sqlite3.h"

 

int main(void)

{

        sqlite3* db = 0;

        sqlite3_stmt* stmt = 0;

        int retcode;

        //mydb라는이름의데이터베이스를연다.

        retcode = sqlite3_open("MyDB", &db);

        if(retcode != SQLITE_OK)

        {

 

               sqlite3_close(db);

               fprintf(stderr, "Could not open Mydb\n");

               return retcode;

        }

 

        retcode = sqlite3_prepare(db, "select SID from Students order by SID", -1, &stmt, 0);

        if(retcode != SQLITE_OK)

        {

               sqlite3_close(db);

               fprintf(stderr, "Could not execuete SELECT\n");

               return retcode;

        }

 

        while(sqlite3_step(stmt) == SQLITE_ROW)

        {

               int i = sqlite3_column_int(stmt, 0);

               printf("SID = %d\n", i);

        }

 

        sqlite3_finalize(stmt);

        sqlite3_close(db);

 

        return SQLITE_OK;

 

}

 

이제 MyDB를 만들어 보자

 

Sqlite3 MyDB “create table students (SID integer)”

Sqlite3 MyDB “insert into students values(200)”

Sqlite3 MyDB “insert into students values(100)”

Sqlite3 MyDB “insert into students values(300)”

 

이제 실행을 시키면 아래와 같은 결과가 나온다.

SID = 100

SID = 200

SID = 300

 

1.1.1.1. sqlite3_open

SQLite 라이브러를 통해서 데이터베이스 파일을 열고 새롭게 연결한다. 데이터베이스 파일이 존재하지 않으면 새로 만든다.

이 함수는 연결 핸들을 반환한다. 이 핸들은 연결된 데이터베이스를 동작시키기 위한 용도로 이용된다. 그리고 이 연결의 상태를 나타낸다.

 

1.1.1.2. sqlite3_prepare

SQL 상태를 수집하는 함수이다. 일반적으로 prepared statement를 제공한다.

상태 핸들을 리턴한다. 이 핸들은 준비되어 있는 상태에 대한 조정을 위해 사용되곤한다.

 

1.1.1.3. sqlite3_step

이 함수는 새로운 row나 더 이상 row가 없는 상태까지 실행된다.

SQLITE_ROW, SQLITE_DONE을 반환한다. 반환할 row가 없는 상태(UPDATE, INSEERT, DELETE, CREATE)에서는 SQLITE_DONE을 반환한다. Step 함수에서 SELECT에 대한 결과는 커서의 위치를 이동한다. Step 함수의 모든 실행은 rowset에서 다음 row로 커서를 이동한다. 커서는 오직 앞으로만 이동이 가능하다.

 

1.1.1.4. sqlite3-column_int

Step 함수에서 SQLITE_ROW를 반환하면 sqlite3_column_* 함수들을 실행해서 각 컬럼의 값을 받을 수 있다.

 

1.1.1.5. sqlite3_finalize

Prepared statement를 소멸한다.

 

1.1.1.6. sqlite3_close

데이터베이스 연결을 종료한다.

 

1.1.2. 직접 SQL 실행하기

 

[소스]

 

static int callback(void *NotUsed, int argc, char **argv, char **colName)

{

        //현재row의각컬럼을반복한다.

        int i;

        for(i = 0; i < argc; i++)

        {

               printf("%s = %s\n", colName[i], argv[i] ? argv[i] : "NULL");

        }

 

        return 0;

 

}

 

 

int main(int argc, char **argv)

{

        sqlite3* db = 0;

        char* zErrMsg = 0;

        int rc;

 

        if(argc != 3)

        {

               fprintf(stderr, "Usage: %s DATABASE-FILE SQL-SATEMENT\n", argv[0]);

               return -1;

        }

        rc = sqlite3_open(argv[1], &db);

        if(rc != SQLITE_OK)

        {

               fprintf(stderr, "Can't open database : %s\n", sqlite3_errmsg(db));

               sqlite3_close(db);

               return -2;

        }

        rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);

        if(rc != SQLITE_OK)

        {

               fprintf(stderr, "SQL error : %s\n", zErrMsg);

        }

        sqlite3_close(db);

        return rc;

}

 

컴파일해서 실행해보자.

 

App2 MyDB “insert int Students values(100)”

 

위와 같이 실행을 후에

 

App2 MyDB “select * from Students”

 

해보면 결과값이 보일 것임

데이터베이스 파일이 없으면 새로 만듬 

//////////////////////////////////////////////////////////////////////////////////////////////////

"VisualC++2005에서 간단하게 SQLite Database사용하기"(http://neodreamer.tistory.com/128)

혹시라도 lib.exe가 실행이 제대로 되지 않으시는 분들은
환경설정에서 Path를 지정해주지 않은 경우가 있습니다.

C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin

를 추가해 주시면 됩니다.

참조:
SQLite :
http://www.sqlite.org/index.html
Sqlite 프로그래밍 :
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/SQLite/Document/article_article_SQLite_%C7%C1%B7%CE%B1%D7%B7%A1%B9%D6
SQLite Windows :
http://www.joinc.co.kr/modules/moniwiki/wiki.php/SQLite%20Windows

//////////////////////////////////////////////////////////////////////////////////////////////////

VS2008에서 SQLite3.6.3의 소스를 이용해서 Static Library를 만들어 보겠습니다.

1. Visual Studio 2008에서 Win32 Console Application 프로젝트를 새로만듭니다.

2. "Win32 응용 프로그램 마법사"에서 "응용 프로그램 설정" 탭에서 "응용 프로그램 종류"는 "정적 라이브러리(S)"를 선택하고, "추가 옵션"에서는 "미리 컴파일된 헤더(P)"는 체크를 해제합니다.

3. 이제 다운로드 받은 sqlite 소스를 프로젝트로 추가합니다.
   여기서 tclsqlite.c 는 사용하지 않으므로 제외하고 추가합니다.

4. 프로젝트 -> 속성 -> 구성 속성 -> C/C++ -> 전처리기 에 보시면 "전처리기 정의"가 잇습니다. 여기에 NO_TCL을 추가해서 TCL 관련 한 것은 제외시키도록 합니다.

5. 프로젝트 -> 속성 -> 구성 속성 -> C/C++ -> 코드 생성 에 보시면 '런타임 라이브러리"가 "다중 스레드 디버그 DLL(/MDd)로 되어있습니다. 이것을 다중 스레드 디버그(/MTd)로 변경합니다.

6. 거슬리는 warning들을 제거 합니다.
   프로젝트 -> 속성 -> 구성 속성 -> C/C++ -> 전처리기 에서 "전처리기 정의"에  _CRT_SECURE_NO_WARNINGS 를 추가합니다.
   그리고 다음의 warning들을 제거합니다.
   프로젝트 -> 속성 -> 구성 속성 -> C/C++ -> 고급 에서 "특정 경고 사용 안 함"에 4267;4244;4018;4311;4996;4312 을 추가해서 무시하도록 합니다.

7. 이제 컴파일 하시면 됩니다.

반응형