English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQLite C / C ++

이 장에서는 C / C ++프로그램에서 SQLite를 사용합니다.

설치

우리의 C / C ++SQLite를 사용하기 전에 컴퓨터에 SQLite 라이브러리를 설정해야 합니다. 설치 과정에 대해 'SQLite 설치' 장을 참조하세요.

C / C ++인터페이스 API

아래는 중요한 C / C ++ SQLite 인터페이스 예제는, C에서 사용할 수 있는 모든 기능을 충분히 제공합니다. / C ++프로그램이 SQLite 데이터베이스를 사용하는 요구사항입니다. 더 복잡한 애플리케이션을 찾고 계신다면 SQLite 공식 문서를 참조하세요.

순번API 및 설명
1

sqlite3_open(const char *filename, sqlite3 **ppDb)

이 절차는 SQLite 데이터베이스 파일과의 연결을 열고, 다른 SQLite 절차에서 사용할 수 있는 데이터베이스 연결 객체를 반환합니다.

만약filename매개변수가 NULL이거나 'memory:'라면 sqlite3_open()는 RAM에서 메모리 데이터베이스를 생성하여, 세션 중에만 존속하는 데이터베이스를 생성합니다.

파일 이름이 NULL이 아니면 sqlite3_open()는 값을 사용하여 데이터베이스 파일을 열려고 시도합니다. 파일이 존재하지 않으면 sqlite3_open()는 새로운 데이터베이스 파일을 열어서 열기에 성공하면 데이터베이스 파일을 열습니다.

2

sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)

이 예제는 sql 매개변수를 통해 제공된 SQL 명령어를 빠르고 간편하게 실행할 수 있는 방법을 제공합니다. 여러 SQL 명령어를 하나의 매개변수로 구성할 수 있습니다.

여기서 첫 번째 매개변수sqlite3는 열린 데이터베이스 객체입니다sqlite_callback는回调 함수로, 다음과 같습니다데이터첫 번째 매개변수이며, 절차에서 발생할 수 있는 모든 오류를 포착하기 위해 errmsg을 반환합니다.

sqlite3_exec() 절차를 분석하고 실행합니다sql매개변수에 주어진 각 명령어를 문자열 끝에 도달하거나 오류가 발생할 때까지 처리합니다.

3

sqlite3_close(sqlite3*)

이 예제는 sqlite를 호출하여 이전에 닫힌3열린 데이터베이스 연결_open()을 열기 전에 모든 준비된 문장이 완료되어야 합니다

미완료된 쿼리가 남아 있으면 sqlite3_close()은 SQLITE_BUSY를 반환하고, 미완료된 문장으로 인해 오류 메시지가 닫히지 않습니다

데이터베이스에 연결

다음 C 코드 단락은 기존 데이터베이스에 연결하는 방법을 보여줍니다. 데이터베이스가 존재하지 않으면 해당 데이터베이스가 생성되고 마지막으로 데이터베이스 객체가 반환됩니다

#include <stdio.h>
#include <sqlite3.h> 
int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   rc = sqlite3_open("test.db", &db); if( rc ) {
      fprintf(stderr, "Failed to open database: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "데이터베이스 성공적으로 열림\n");
   }
   sqlite3_close(db);
}

이제, 위 프로그램을 컴파일하고 실행하여test.db현재 디렉토리에서 데이터베이스를 생성합니다. 필요에 따라 경로를 변경할 수 있습니다.

$gcc test.c -l sqlite3
$./a.out
데이터베이스 성공적으로 열림

C를 사용하려면 ++소스 코드를 컴파일하려면 다음과 같이 코드를 컴파일할 수 있습니다-

$g++ test.c -l sqlite3

여기서는 프로그램을 sqlite와 연결합니다3라이브러리는 C 프로그램이 필요한 기능을 제공하기 위해 연결되었습니다. 이는您的目录에서 데이터베이스 파일 test.db를 생성하며, 다음과 같은 결과를 얻을 수 있습니다.

-rwxr-xr-x. 1 root root 7383 May 8 02:06 a.out
-rw-r--r--. 1 root root  323 May 8 02:05 test.c
-rw-r--r--. 1 root root    0 May 8 02:06 test.db

테이블 생성

다음 C 코드 단락은 이전에 생성된 데이터베이스에서 테이블을 생성하는 데 사용됩니다-

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h> 
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
   int i;
   for(i = 0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}
int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   /*Database open*/
   rc = sqlite3_open("test.db", &db);   
   if( rc ) {
      fprintf(stderr, "Failed to open database: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stdout, "데이터베이스 성공적으로 열림\n");
   }
   /* SQL 문 생성 */
   sql = "CREATE TABLE COMPANY(" \
      "ID INT PRIMARY KEY     NOT NULL," \
      "NAME           TEXT    NOT NULL," \
      "AGE            INT     NOT NULL," \
      "ADDRESS        CHAR("50)," \
      "SALARY         REAL ");;
   /* SQL 문장 실행 */
   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
   
   if( rc != SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "테이블 생성 성공\n");
   }
   sqlite3_close(db);
   return 0;
}

위 프로그램을 컴파일하고 실행하면 test.db에 COMPANY 테이블이 생성되며, 파일의 최종 목록은 다음과 같습니다-

-rwxr-xr-x. 1 root root 9567 May 8 02:31 a.out
-rw-r--r--. 1 root root 1207 May 8 02:31 test.c
-rw-r--r--. 1 root root 3072 May 8 02:31 test.db

Insert 작업

다음 C 코드 단락은 위의 예제에서 생성된 COMPANY 테이블에 기록을 생성하는 방법을 보여줍니다-

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h> 
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
   int i;
   for(i = 0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}
int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   /* 데이터베이스 열기 */
   rc = sqlite3_open("test.db", &db);   
   if( rc ) {
      fprintf(stderr, "Failed to open database: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Database successfully opened\n");
   }
   /* SQL 문 생성 */
   sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
         "VALUES ("1, 'Paul', 32, 'California', 20000.00 )" \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
         "VALUES ("2, 'Allen', 25, 'Texas', 15000.00 )" \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
         "VALUES ("3, 'Teddy', 23, 'Norway', 20000.00 )" \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
         "VALUES ("4, 'Mark', 25, 'Rich',-Mond', 65000.00 );";
   /* SQL 문장 실행 */
   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
   
   if( rc != SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "기록이 성공적으로 생성되었습니다\n");
   }
   sqlite3_close(db);
   return 0;
}

위의 프로그램을 컴파일하고 실행하면 COMPANY 테이블에 주어진 기록이 생성되고 다음 두 행이 표시됩니다-

데이터베이스가 성공적으로 열렸습니다
기록이 성공적으로 생성되었습니다

Select 작업

실제 예제를 통해 기록을 가져오기 전에, 콜백 함수에 대해 사용되는 몇 가지 세부 사항을 살펴보겠습니다. 이 콜백은 SELECT 문에서 결과를 가져오는 방법을 제공합니다. 다음과 같은 선언을 가지고 있습니다-

typedef int (*sqlite3_callback)(
   void*,    /* sqlite3_exec()의4파라미터로 제공된 데이터 */
   int,      /* 행의 열 수 */
   char**,   /* 행의 필드를 나타내는 문자열 배열 */
   char**    /* 컬럼 이름을 나타내는 문자열 배열 */
);

위의 콜백이 sqlite_exec() 절차에서 세 번째 매개변수로 제공되면 SQLite는 SQL 매개변수 내에서 실행된 각 SELECT 문에 대해 처리되는 각 기록에 대해 이 콜백 함수를 호출합니다.

다음 C 코드 부분은 예제에서 생성된 COMPANY 테이블에서 기록을 가져오고 표시하는 방법을 보여줍니다.-

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h> 
static int callback(void *data, int argc, char **argv, char **azColName){
   int i;
   fprintf(stderr, "%s: ", (const char*)data);
   
   for(i = 0; i<argc; i++){
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   
   printf("\n");
   return 0;
}
int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   const char* data = "Callback function called";
   /* Database open */
   rc = sqlite3_open("test.db", &db);   
   if( rc ) {
      fprintf(stderr, "Failed to open database: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Database successfully opened\n");
   }
   /* SQL 문 생성 */
   sql = "SELECT" * from COMPANY";
   /* SQL 문장 실행 */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
   
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "작업이 성공적으로 완료되었습니다\n");
   }
   sqlite3_close(db);
   return 0;
}

위 프로그램을 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

데이터베이스가 성공적으로 열렸습니다
콜백 함수 호출됨: ID = 1
NAME = Paul
AGE = 32
ADDRESS = 캘리포니아
SALARY = 20000.0
콜백 함수 호출됨: ID = 2
NAME = Allen
AGE = 25
ADDRESS = Texas
SALARY = 15000.0
콜백 함수 호출됨: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = 노르웨이
SALARY = 20000.0
콜백 함수 호출됨: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-월요일
SALARY = 65000.0
작업이 성공적으로 완료되었습니다

UPDATE 작업

다음 C 코드 부분은 UPDATE 문을 사용하여 어떤 기록을 업데이트하고 COMPANY 테이블에서 업데이트된 기록을 가져오고 표시하는 방법을 보여줍니다.

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h> 
static int callback(void *data, int argc, char **argv, char **azColName){
   int i;
   fprintf(stderr, "%s: ", (const char*)data);
   
   for(i = 0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}
int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   const char* data = "Callback function called";
   /* 데이터베이스 열기 */
   rc = sqlite3_open("test.db", &db);   
   if( rc ) {
      fprintf(stderr, "Failed to open database: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Database successfully opened\n");
   }
   /*합병 SQL 문장 생성*/
   sql = "UPDATE COMPANY set SALARY =" 25000.00에서 ID=1; " \
         "SELECT * from COMPANY";
   /* SQL 문장 실행 */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
   
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Operation done successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

위 프로그램을 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

데이터베이스가 성공적으로 열렸습니다
콜백 함수 호출됨: ID = 1
NAME = Paul
AGE = 32
ADDRESS = 캘리포니아
SALARY = 25000.0
콜백 함수 호출됨: ID = 2
NAME = Allen
AGE = 25
ADDRESS = Texas
SALARY = 15000.0
콜백 함수 호출됨: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = 노르웨이
SALARY = 20000.0
콜백 함수 호출됨: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-월요일
SALARY = 65000.0
운영이 성공적으로 완료되었습니다

Delete 작업

아래 C 코드 부분은 DELETE 문장을 사용하여 어떤 기록도 제거하고, 나머지 기록을 COMPANY 테이블에서 가져와 표시하는 방법을 보여줍니다.

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h> 
static int callback(void *data, int argc, char **argv, char **azColName) {
   int i;
   fprintf(stderr, "%s: ", (const char*)data);
   
   for(i = 0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}
int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   const char* data = "Callback function called";
   /* Database open */
   rc = sqlite3_open("test.db", &db);   
   if( rc ) {
      fprintf(stderr, "Failed to open database: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Database successfully opened\n");
   }
   /* 합병 SQL 문장 생성 */
   sql = "DELETE from COMPANY where ID=",2; " \
         "SELECT * from COMPANY";
   /* SQL 문장 실행 */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
   
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Operation done successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

위 프로그램을 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

데이터베이스가 성공적으로 열렸습니다
콜백 함수 호출됨: ID = 1
NAME = Paul
AGE = 32
ADDRESS = 캘리포니아
SALARY = 20000.0
콜백 함수 호출됨: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = 노르웨이
SALARY = 20000.0
콜백 함수 호출됨: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-월요일
SALARY = 65000.0
운영이 성공적으로 완료되었습니다