프로그래밍
SQLite3 기본 사용법
ngcbbs
2012. 3. 30. 12:54
SQLite3 다운로드 : http://sqlite.org/download.html
SQLite3 라이센스 : Public Domain
기본적으로 다운로드 받은 소스에서 sqlite3.c / sqlite3.h / sqlite3ext.h 만 프로젝트에 포함시키면 SQLite3 를 사용할 수 있다.
SQLite3 의 장점. 작고, 설정 필요 없이 사용가능하고, 단일 파일에 모든 내용이 저장되며, 여러 플랫폼에서 하나의 db 파일을 사용할 수 있다.
SQLite3 를 통해 작업중인 맵에디터에 리소스 관리 부분을 붙여보기 위해서 사용법을 익히는중..(@_@b) <>
#include <stdio.h>
#include <stdlib.h>
#include "sqlite3/sqlite3.h"
static int callback(void* notUse, int argc, char** argv, char** colName)
{
// sql 구문에 의해서 명령어 처리시 사용되는 콜백함수.
// argc : 데이터 갯수.
// argv : 데이터 항목.
// colName : 데이터 항목의 분류명.
/*
* 예제 db 테이블...
* /'''''''' argc '''''''''\
* +--------------+---------+
* | char name(80)| int agc | <-- colName
* +--------------+---------+
* | 이름1 | 10 | <-- argv
* | 이름11 | 20 |
* +--------------+---------+
*/
for (int i = 0; i < argc; ++i)
{
printf("%s = %s\n", colName[i], argv[i] ? argv[i] : "(null)");
}
printf("\n");
return 0;
}
#define CHECK_QUIT(INFO, RET) \
if (ret != SQLITE_OK) { fprintf(stderr, "'%s' error\n", INFO); return RET; }
#define CHECK(INFO) \
if (ret != SQLITE_OK) { fprintf(stderr, "'%s' error\n", INFO); }
#define ERROR(INFO) \
fprintf(stderr, "%s : '%s'\n", INFO, sqlite3_errmsg(db));
int main(int argc, char** argv)
{
sqlite3* db;
char* errMsg = NULL;
char* filename = "test.db"; /// 해당 파일이 없는 경우 sqlite3_open 함수 호출시 빈 db 파일 생성.
char* createTableQuery = "create table test_table(name text(20), age int);";
char* insertDataQuery = "insert into test_table(name, age) values('이름', 10);";
char* requestTableQuery = "select * from test_table;";
int ret = sqlite3_open(argv[1], &db);
if (ret == SQLITE_OK)
{
/// 1. 테스트 테이블 생성
ret = sqlite3_exec(db, createTableQuery, callback, 0, &errMsg);
CHECK("createTableQuery");
/// 2. 테스트 테이블에 데이터 삽입
ret = sqlite3_exec(db, insertDataQuery, callback, 0, &errMsg);
CHECK("insertDataQuery");
/// 3. 테스트 테이블 요청
ret = sqlite3_exec(db, requestTableQuery, callback, 0, &errMsg);
CHECK("requestTableQuery");
/// 4. sqlite3_exe 함수와 callback 함수를 사용하지 않고 데이터 읽기. (3단계와 같은 동작)
{
sqlite3_stmt* stmt;
ret = sqlite3_exec(db, "BEGIN", 0, 0, 0);
CHECK("트랜잭션 걸기");
if (sqlite3_prepare(db, requestTableQuery, -1, &stmt, NULL) == SQLITE_OK)
{
while (sqlite3_step(stmt) == SQLITE_ROW)
{
/// windows 콘솔창에서 한글이 출력되지 않으면.. setlocale(LC_ALL, "") 함수를
/// 통해서 출력되도록 할 수 있다.
wprintf(L"name:%s, age:%s\n",
(char*)sqlite3_column_text(stmt, 0),
(char*)sqlite3_column_text(stmt, 1));
}
}
else
{
ERROR("에러");
}
ret = sqlite3_exec(db, "END", 0, 0, 0);
CHECK("트랜잭션 해제");
sqlite3_finalize(stmt);
}
sqlite3_close(db);
}
else
{
ERROR("데이터베이스 열기 실패");
sqlite3_close(db);
return -1;
}
return 0;
}