bookmark_borderVisual C++ 2005 에서 간단하게 SQLite Database 사용하기

우선 SQLite 사이트에서 윈도우용 DLL 파일과 소스 파일을 다운 받는다.

SQLite 3.6.0 Source 
SQLite 3.6.0 DLL    

다운로드 받은 파일들을 프로젝트의 임의의 폴더에 풀어 놓는다.

압축을 풀어놓은 파일들

압축을 풀어놓은 파일들

시작 메뉴의 “Visual Studio 2005 명령 프롬프트 열기”를 실행하여 도스프롬프트창을 열고 다운로드 받아서 압축을 풀어놓은 폴더로 이동하여 다음 명령을 수행하여 프로젝트에 사용할 .lib파일을 생성한다.

>LIB /DEF:sqlite3.def /MACHINE:x86

Library 생성 화면

Library 생성 화면

작업 후 파일 목록

작업 후 파일 목록


로젝트 속성페이지의 C/C++ 항목의 추가 포함디렉토리와 링커 함목의 추가 라이브러리 디렉토리에 위에서 작업한 디렉토리의 경로를
입력해 주고 링커 함목의 추가 종속성에 위에서 만들어진 Library 파일인 sqlite3.lib 를 추가해 주면 프로젝트
설정은 끝이다.

이제 SQLite 에 접속하여 작업을 할 클래스 헤더파일에 “sqlite3.h” 파일을 포함시키고 callback 함수를 선언해 준다.

SQLite3 에서 질의를 하면 리턴받을 데이터가 있을경우 callback 함수를 호출하여 데이터를 넘겨주기때문에 callback 함수를 작성해 주어야 한다.

01 #include "sqlite3.h"
02  
03 static int callback(void *NotUsed, int argc, char **argv, char **azColName)
04 {
05     int i;
06     for( i = 0; i < argc; i++)
07     {
08         TRACE("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
09     }
10     printf("\n");
11     return 0;
12 };

그리고 소스 파일에서 작업을 하면 된다.

01 sqlite3 *pSQLite3 = NULL; // SQLite DB 객체 저장 변수
02 char    *szErrMsg = NULL; // Error 발생시 메세지를 저장하는 변수
03  
04 // 데이터베이스 열기 : 파일이 존재하지 않으면 생성한다.
05 int rst = sqlite3_open( "test.db", &pSQLite3);
06  
07 if ( rst )
08 {
09     TRACE( "Can't open database: %s\n", sqlite3_errmsg( pSQLite3 ));
10  
11     sqlite3_close( pSQLite3 );
12     pSQLite3 = NULL;
13 }
14 else
15 {
16     TRACE("Database opened!!\n");
17  
18     // 테이블 생성
19     rst = sqlite3_exec(pSQLite3,
20         "CREATE TABLE member ( name TEXT(20), age INTEGER )",
21         callback, 0, &szErrMsg);
22  
23     // 데이터 삽입
24     rst = sqlite3_exec(pSQLite3,
25         "INSERT INTO member ( name, age ) values ( 'andy', 20 )",
26         callback, 0, &szErrMsg);
27  
28     // 데이터 질의
29     rst = sqlite3_exec(pSQLite3,
30         "SELECT * FROM member",
31         callback, 0, &szErrMsg);
32 }
33  
34 //객체 해제
35 sqlite3_free( szErrMsg );
36 sqlite3_close( pSQLite3 );

위 코드를 수행한 후의 출력창

출력창 내용

출력창 내용

데모 프로젝트

bookmark_borderSQLite와 C++연동방법

DB 서버를 설치하지 않고 DB처럼 테이블만들고 쿼리할 수 있는 공개 라이브러리다.

DB관련 내용을 Local에 파일로 생성하고 이 파일을 DB처럼 사용한다.

Prepare->Binding->Execute 가능하고,

Transaction 처리도 가능하다.

 

아직 실무에 사용해보진 않았지만 테스트 중….

 

아래 사이트는 SQLite를 C++로 한번 싸서 사용하기 편하게만든 소스 사용법이다.

공식홈페이지 : http://www.sqlite.org

 

 

SQLite 와 C++ 연동방법  [출처] 열여덟번째-SQLite 와 C++ 연동방법|작성자 모노

JamSun2 SQLite 간단사용법  SQLite 간단 사용법

SQLite Spy(MSSQL의 쿼리분석기같은것) http://www.yunqa.de/delphi/doku.php/products/sqlitespy/index  오른쪽에 Download 있다.

bookmark_borderSQLite C++연동 방법

어플리케이션을 개발하다보면 로컬에 자료를 저장할 필요성이 발생하는 경우가 있습니다.

단순하게 ini 나  레지스트리 수준으로 저장할 분량이라면 문제가 안되겠지만

좀더 양이 방대해졌을 경우 예를 들어 음악파일 리스트 같은 들어보면 단순하게

이정보를 파일 형태로 저장하기 보다는 데이타베이스로 저장할 필요성이 생기게 됩니다.

 

그렇다고 어플리케이션용 데이타 베이스로 MSSQL 이나 오라클 같은 엔터프라이즈급 데이타베이스를

쓸 수는 없는 상황이구요.

이런 용도에 가장 많이 쓰이는 데이타베이스가 SQLite 입니다. (sqlite 공식
홈페이지 🙂

 

금번 강좌는 어플리케이션에서 널리 사용되는 SQLite 에 대해 간단한 테이블 생성법, 그리고C++ 로 개발되는

어플리케이션에서 데이터를 불러오고 데이타를 갱신하는 방법에 대해 설명 드리고자 합니다.

 

1> SQLitSpy 프로그램 사용하기

SQLite 전용으로 사용되는 freeware 로 SQLiteSpy.exe 라는 프로그램이
있습니다.

아래 이미지를 보시면 아시겠지만 비 상업적 용도나 교육용으로 사용될때는 별로의 라이센스fee 없이 사용이 가능한 버전입니다.

첨부된 압축 파일을 다운받으시면 프로그램을 보실 수가 있습니다.

 

 

아래 이미지와 같이 SQLiteSpy 프로그램 실행 후 New Database 메뉴를 클릭하여

db 파일을 생성합니다.

참고로 전 SQLiteExam 이란 다이얼로그베이스 어플리케이션을 만들고 sample.db 파일을 생성했습니다.

 

 

 

테이블을 하나 만들어 보겠습니다.

 

– 생성한 sample.db 파일을 open 합니다.

 

-Execute -> Execute SQL 로 아래의 SQL 을 실행합니다.

CREATE TABLE sample_product (product_code
TEXT ,
product_name TEXT,
Update_dates DATE)

 

sample_product 란 테이블을 생성합니다.

 

 

성공적으로 테이블이 생성됨을 확인합니다.

 

 

기본적인 SQL 구문에 대해서는 아래 링크를 참조하시기 바랍니다.

 

 

2>C++과 연동하기

– CppSQLite3U.cpp , CppSQLite3U.h, sqlite3.h 를 프로젝트에 추가합니다.

  *공개된 Open 소스로 Wrapper Class 역할을 합니다.

 

 

-sqlite3.lib 참조를 추가합니다.

 

-SQLiteExamDlg.h 에 헤더파일(CppSQLite3U.h)을 include
시키며 멤버 변수(CppSQLite3DB m_DB)를 선언합니다.

동적으로 함수 두개(입력 ,조회)를 생성합니다.

 

 

– OnInitDilaog 에서 DB 오픈하며, 입력 조회 부분의 함수를 아래와 같이 구현합니다.

 

#include “stdafx.h”
#include “SQLiteExam.h”
#include
“SQLiteExamDlg.h”
#include

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define
MAIN_DB_FILE_NAME       _T(“sample.db”)

중략….

 

BOOL CSQLiteExamDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // Add “About…” menu item to system menu.

 // IDM_ABOUTBOX must be in the system command
range.
 ASSERT((IDM_ABOUTBOX & 0xFFF0) ==
IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu !=
NULL)
 {
  CString
strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if
(!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING,
IDM_ABOUTBOX, strAboutMenu);
  }
 }

 // Set the icon for this dialog.  The framework does this
automatically
 //  when the application’s main window is not a
dialog
 SetIcon(m_hIcon, TRUE);   // Set big icon
 SetIcon(m_hIcon,
FALSE);  // Set small icon

 // TODO: Add extra initialization here
 

//DB 파일을 여는 부분입니다
 CString
sDBFilePath;
 sDBFilePath.Format(_T(“%s”),
MAIN_DB_FILE_NAME);
 
 m_DB.open(sDBFilePath);

 return TRUE;  // return TRUE  unless you set the focus to a control
}

 

//insert 구문 예제 부분입니다

void CSQLiteExamDlg::OnBnClickedInput()
{  
  //제품 코드를 입력합니다.

  //난수를 발생시켜 문자열화 한후 입력하는 예제입니다
  int pCode = rand();
  CString
pProduct_code,sQuery;
 
  pProduct_code.Format(_T(“%d”),pCode);
 
  sQuery.Format(_T(“INSERT
INTO sample_product (product_code, product_name, update_dates) VALUES (
‘%s’,’aaaaa’,current_timestamp)”),pProduct_code);

 
  m_DB.execQuery(sQuery);

 // TODO: Add your control notification handler code here
}

 

//select  구문 예제 부분입니다

void CSQLiteExamDlg::OnBnClickedSelect()
{
 CString sQuery;

 //전체 제품 갯수를 가져옴
 sQuery =  _T(“SELECT count(*) FROM sample_product”);

 CppSQLite3Query pCountSql = m_DB.execQuery(sQuery);
 while( !
pCountSql.eof() )
 {
  CString sCount = 
pCountSql.fieldValue(0);
 
   pCountSql.nextRow();
 }
 
  //
TODO: Add your control notification handler code here
}

 

-입력 결과를 SQLiteSpy 프로그램에서 확인합니다.

 

 

이상입니다.

http://kin.naver.com/open100/detail.nhn?d1id=1&dirId=1040101&docId=914616&qb=U1FMaXRl&enc=utf8&section=kin&rank=3&sort=0&spq=0&pid=f2v1Udoi5Ussss794vosss–313273&sid=S2DlDMnFYEsAAEO4Neo