[C] SQLite 제어하기: C언어로 SQLite 를 다루는 간단한 방법

SQLite는 경량의 디스크 기반 데이터베이스 관리 시스템으로, C 언어로 간단하게 제어할 수 있습니다. 이 문서에서는 SQLite를 C 언어로 효과적으로 활용하는 방법을 알아보겠습니다. SQLite를 활용하면 데이터베이스를 생성하고 관리하는 작업을 간편하게 수행할 수 있으며, C 언어의 강력한 기능을 활용하여 다양한 응용프로그램을 개발할 수 있습니다.

SQLite 라이브러리 추가하기

SQLite를 C 언어에서 사용하기 위해서는 먼저 프로젝트에 SQLite 라이브러리를 추가해야 합니다. 일반적으로는 SQLite의 공식 웹사이트에서 소스 코드를 다운로드하여 컴파일하여 사용할 수 있습니다. 소스 코드를 다운로드한 후에는 해당 라이브러리를 프로젝트에 추가하고, 헤더 파일을 포함하여 SQLite를 사용할 준비를 마칠 수 있습니다.

공식 다운로드 사이트는 다음과 같습니다.

https://www.sqlite.org/download.html

라이브러리를 직접 빌드 하길 원하신다면 제 블로그 다음글을 참고 하시면 됩니다.

  • 윈도우즈 visual studio 에서 라이브러리 추가 하는 방법

속성->링커->일반->추가 라이브러리 디렉터리 의 속성값에 sqlite 폴더추가
속성->링커->입력->추가종속성 의 값에 sqlite3.lib 추가

  • 리눅스 gcc 라면

gcc -I ./sqlite3/libsqlite3.a -L ./sqlite3

SQLite 데이터베이스 제어하기

SQLite를 사용하여 데이터베이스를 제어하는 방법을 알아봅시다. 아래 예제 코드는 SQLite 데이터베이스를 열고, 테이블을 생성하고, 데이터를 삽입하고, 결과를 쿼리하여 출력하는 기본적인 동작을 수행합니다.

아래 아주 간단한 예제를 포함합니다.

#include <stdio.h>
#include <sqlite3.h>

int main() {
    sqlite3 *db;
    char *err_msg = 0;

    // 데이터베이스 열기
    int rc = sqlite3_open("test.db", &db);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "데이터베이스 열기 오류: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    }

    // 테이블 생성
    char *sql = "CREATE TABLE IF NOT EXISTS Test (id INT, name TEXT);";
    rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "테이블 생성 오류: %s\n", err_msg);
        sqlite3_free(err_msg);
    }

    // 데이터 삽입
    sql = "INSERT INTO Test VALUES (1, 'John');";
    rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "데이터 삽입 오류: %s\n", err_msg);
        sqlite3_free(err_msg);
    }

    // 데이터 조회
    sql = "SELECT * FROM Test;";
    sqlite3_stmt *stmt;
    rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
    if (rc == SQLITE_OK) {
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            int id = sqlite3_column_int(stmt, 0);
            const unsigned char *name = sqlite3_column_text(stmt, 1);
            printf("ID: %d, Name: %s\n", id, name);
        }
        sqlite3_finalize(stmt);
    } else {
        fprintf(stderr, "데이터 조회 오류: %s\n", sqlite3_errmsg(db));
    }

    // 데이터베이스 닫기
    sqlite3_close(db);

    return 0;
}

위 코드를 컴파일하고 실행하면 test.db 라는 SQLite 데이터베이스 파일이 생성되고, 테이블이 생성되며, 데이터가 삽입되고 조회됩니다. 이를 참고하여 SQLite를 C 언어로 효과적으로 제어할 수 있습니다.

SQLite 데이터베이스 관리하기

SQLite를 사용하여 데이터베이스를 관리하는 방법을 자세히 살펴봅시다. SQLite를 활용하면 데이터베이스를 생성, 열기, 닫기 등의 작업을 간편하게 수행할 수 있습니다. 또한, 테이블을 생성하고 조회하는 등의 데이터베이스 관리 작업도 쉽게 수행할 수 있습니다.

데이터베이스 생성 및 열기

SQLite를 사용하여 데이터베이스를 생성하고 열기 위해서는 sqlite3_open() 함수를 사용합니다. 이 함수는 데이터베이스를 열고 해당 데이터베이스에 대한 핸들을 반환합니다. 데이터베이스를 열 때는 데이터베이스 파일의 경로를 지정해야 합니다. 만약 지정된 경로에 데이터베이스 파일이 없다면 새로운 데이터베이스 파일이 생성됩니다.

  1. sqlite3_open 함수의 구문

sqlite3_open() 함수의 기본 구문은 다음과 같습니다.

int sqlite3_open(const char *filename, sqlite3 **ppDb);
  • filename: 열고자 하는 데이터베이스 파일의 경로를 지정합니다.
  • ppDb: 열린 데이터베이스에 대한 핸들을 저장할 포인터의 포인터입니다.
  1. sqlite3_open 함수의 반환값

sqlite3_open() 함수의 반환값은 정수형입니다. 성공적으로 데이터베이스를 열 경우 SQLITE_OK를 반환하며, 실패한 경우 해당하는 오류 코드를 반환합니다.

  1. sqlite3_open 함수의 사용 예제

다음은 sqlite3_open() 함수를 사용하여 데이터베이스를 열고 성공 여부를 확인하는 간단한 예제입니다.

#include <stdio.h>
#include <sqlite3.h>

int main() {
    sqlite3 *db;
    int rc = sqlite3_open("test.db", &db);
    if (rc == SQLITE_OK) {
        printf("데이터베이스 열기 성공\n");
        // 열린 데이터베이스를 사용하는 코드 작성
        sqlite3_close(db); // 데이터베이스를 사용한 후에는 반드시 닫아주어야 합니다.
        return 0;
    } else {
        fprintf(stderr, "데이터베이스 열기 실패: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    }
}

SQLite 쿼리 실행

  1. sqlite3_exec 함수: SQLite 쿼리 실행**

SQLite는 경량의 디스크 기반 데이터베이스 관리 시스템으로, C 언어에서 사용할 수 있는 강력한 기능을 제공합니다. 데이터베이스를 조작하고 관리하기 위해서는 SQL 쿼리를 실행해야 하는데, 이를 위해 사용되는 함수 중 하나가 sqlite3_exec()입니다. 이 함수는 SQLite 데이터베이스에 대한 SQL 쿼리를 실행하고 그 결과를 처리할 수 있게 해줍니다.

  1. sqlite3_exec 함수의 구문

sqlite3_exec() 함수의 기본 구문은 다음과 같습니다.

int sqlite3_exec(sqlite3* db, const char* sql, int (*callback)(void*, int, char**, char**), void* data, char** errmsg);
  • db: SQL 쿼리를 실행할 데이터베이스에 대한 핸들입니다.
  • sql: 실행할 SQL 쿼리입니다.
  • callback: 쿼리 실행 결과를 처리할 콜백 함수입니다. 이 인자를 NULL로 전달하면 콜백 함수를 사용하지 않고, 실행 결과를 무시합니다.
  • data: 콜백 함수에 전달할 사용자 지정 데이터입니다.
  • errmsg: 오류 메시지를 저장할 포인터입니다. 오류가 발생하지 않았을 경우에는 NULL을 반환합니다.
  1. sqlite3_exec 함수의 반환값

sqlite3_exec() 함수의 반환값은 정수형입니다. 성공적으로 SQL 쿼리를 실행한 경우 SQLITE_OK를 반환하며, 실패한 경우 해당하는 오류 코드를 반환합니다.

  1. sqlite3_exec 함수의 사용 예제

다음은 sqlite3_exec() 함수를 사용하여 데이터베이스에서 테이블을 생성하는 예제입니다.

#include <stdio.h>
#include <sqlite3.h>

int main() {
    sqlite3 *db;
    char *errmsg = 0;
    int rc = sqlite3_open("test.db", &db);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "데이터베이스 열기 오류: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    }

    char *sql = "CREATE TABLE IF NOT EXISTS Test (id INT, name TEXT);";
    rc = sqlite3_exec(db, sql, 0, 0, &errmsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "테이블 생성 오류: %s\n", errmsg);
        sqlite3_free(errmsg);
    } else {
        printf("테이블이 성공적으로 생성되었습니다.\n");
    }

    sqlite3_close(db);
    return 0;
}

테이블 생성

SQLite를 사용하여 테이블을 생성하기 위해서는 sqlite3_exec() 함수를 사용합니다. 이 함수는 SQL 쿼리를 실행하고 그 결과를 반환합니다. 테이블을 생성할 때는 CREATE TABLE 문을 사용하며, 필요한 필드와 해당 필드의 데이터 형식을 지정하여 테이블을 생성할 수 있습니다.

데이터 삽입

SQLite를 사용하여 데이터를 삽입하기 위해서는 sqlite3_exec() 함수를 사용합니다. 이 함수는 SQL 쿼리를 실행하고 그 결과를 반환합니다. 데이터를 삽입할 때는 INSERT INTO 문을 사용하며, 삽입할 데이터의 값을 지정하여 데이터를 삽입할 수 있습니다.

데이터 조회

SQLite를 사용하여 데이터를 조회하기 위해서는 sqlite3_prepare_v2() 함수와 sqlite3_step() 함수를 사용합니다. 먼저 sqlite3_prepare_v2() 함수를 사용하여 SQL 쿼리를 준비한 후, sqlite3_step() 함수를 사용하여 쿼리를 실행하고 결과를 가져올 수 있습니다. 결과를 가져올 때는 sqlite3_column_ 계열의 함수를 사용하여 각 필드의 값을 가져올 수 있습니다.

int getdata(const char *field, void *value, int *lengh)
{
    int retval;
    int rc;
    int type;
    char sqlstr[1024];
    char *errmsg_p = NULL;
    sqlite3_stmt *pstmt_dml = NULL;

    if(value!=NULL) *(int *)value = 0;
    if(lengh!=NULL) *lengh = 0;

    sprintf(sqlstr, "SELECT %s FROM Test LIMIT 1", field );

    retval = sqlite3_prepare_v2(dcu_conf_sp, sqlstr, -1, &pstmt_dml, NULL);
    if (retval != SQLITE_OK)
    {
        printf("get_conf_db fail sql prepair %d:%s\n", retval, errmsg_p != NULL ? errmsg_p : sqlite3_errstr(retval));
        if (errmsg_p)
            sqlite3_free(errmsg_p);
        return retval;
    }

    retval = sqlite3_step(pstmt_dml);
    type = sqlite3_column_type(pstmt_dml, 0);

    switch(type)
    {
        case SQLITE_INTEGER:
            *(int *)value = sqlite3_column_int(pstmt_dml, 0);
            *lengh = 4;
            break;
        case SQLITE_TEXT:
            if( sqlite3_column_text(pstmt_dml, 0) != NULL)
                strcpy((char *)value, sqlite3_column_text(pstmt_dml, 0));
            *lengh = strlen((char *)value);
            break;
        case SQLITE_BLOB:
            *lengh = sqlite3_column_bytes(pstmt_dml, 0);
            if (0 < *lengh)
                memcpy(value, sqlite3_column_blob(pstmt_dml, 0), *lengh);
            break;
        default:
            retval = SQLITE_ERROR;
            break;
    }

    sqlite3_finalize(pstmt_dml);
    return retval;
}

위코드는 sqlite3_column_type 로 필드의 데이터 타입을 먼저 쿼리 하고 타입에 맞게 sqlite3_column_ 계열의 함수를 활용 하여 값을 가져오는 코드입니다. 이처럼 유동적으로 값을 쿼리 할 수 있습니다.

결론

이상으로 SQLite를 C 언어로 제어하는 방법에 대해 알아보았습니다. SQLite를 활용하여 데이터베이스를 생성하고 관리하는 방법을 익히면, 다양한 응용프로그램을 개발할 수 있을 것입니다. 부가적으로, 이러한 작업을 효율적으로 수행하기 위해선 SQLite의 다양한 기능과 C 언어의 특징을 잘 활용하는 것이 중요합니다.

Leave a Comment