SQLite - C / C ++

Di bab ini, Anda akan mempelajari cara menggunakan SQLite dalam program C / C ++.

Instalasi

Sebelum Anda mulai menggunakan SQLite di program C / C ++ kami, Anda perlu memastikan bahwa Anda telah menyiapkan library SQLite di mesin. Anda dapat memeriksa bab Instalasi SQLite untuk memahami proses instalasi.

C / C ++ Interface API

Berikut ini adalah rutinitas penting antarmuka C / C ++ SQLite, yang dapat memenuhi persyaratan Anda untuk bekerja dengan database SQLite dari program C / C ++ Anda. Jika Anda mencari aplikasi yang lebih canggih, Anda dapat melihat dokumentasi resmi SQLite.

Sr.No. API & Deskripsi
1

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

Rutinitas ini membuka koneksi ke file database SQLite dan mengembalikan objek koneksi database untuk digunakan oleh rutinitas SQLite lainnya.

Jika argumen nama file adalah NULL atau ': memory:', sqlite3_open () akan membuat database dalam memori dalam RAM yang hanya bertahan selama sesi.

Jika nama file bukan NULL, sqlite3_open () mencoba membuka file database dengan menggunakan nilainya. Jika tidak ada file dengan nama itu, sqlite3_open () akan membuka file database baru dengan nama itu.

2

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

Rutinitas ini menyediakan cara cepat dan mudah untuk menjalankan perintah SQL yang disediakan oleh argumen sql yang dapat terdiri dari lebih dari satu perintah SQL.

Di sini, argumen pertama sqlite3 adalah objek database terbuka, sqlite_callback adalah panggilan balik yang datanya adalah argumen pertama dan errmsg akan dikembalikan untuk menangkap setiap kesalahan yang dimunculkan oleh rutinitas.

SQLite3_exec () melakukan parsing rutin dan mengeksekusi setiap perintah yang diberikan di sql argumen hingga mencapai akhir string atau menemui kesalahan.

3

sqlite3_close(sqlite3*)

Rutin ini menutup koneksi database yang sebelumnya dibuka oleh panggilan ke sqlite3_open (). Semua pernyataan yang disiapkan terkait dengan koneksi harus diselesaikan sebelum menutup koneksi.

Jika masih ada pertanyaan yang belum diselesaikan, sqlite3_close () akan mengembalikan SQLITE_BUSY dengan pesan kesalahan Tidak dapat ditutup karena pernyataan yang tidak diselesaikan.

Terhubung ke Database

Mengikuti segmen kode C menunjukkan cara menyambungkan ke database yang sudah ada. Jika database tidak ada, maka akan dibuat dan akhirnya objek database akan dikembalikan.

#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, "Can't open database: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Opened database successfully\n");
   }
   sqlite3_close(db);
}

Sekarang, mari kita kompilasi dan jalankan program di atas untuk membuat database kita test.dbdi direktori saat ini. Anda dapat mengubah jalur Anda sesuai kebutuhan Anda.

$gcc test.c -l sqlite3
$./a.out
Opened database successfully

Jika Anda akan menggunakan kode sumber C ++, maka Anda dapat mengompilasi kode Anda sebagai berikut -

$g++ test.c -l sqlite3

Di sini, kami menghubungkan program kami dengan pustaka sqlite3 untuk menyediakan fungsi yang diperlukan ke program C. Ini akan membuat file database test.db di direktori Anda dan Anda akan mendapatkan hasil sebagai berikut.

-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

Buat Tabel

Segmen kode C berikut akan digunakan untuk membuat tabel di database yang dibuat sebelumnya -

#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;

   /* Open database */
   rc = sqlite3_open("test.db", &db);
   
   if( rc ) {
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stdout, "Opened database successfully\n");
   }

   /* Create SQL statement */
   sql = "CREATE TABLE COMPANY("  \
      "ID INT PRIMARY KEY     NOT NULL," \
      "NAME           TEXT    NOT NULL," \
      "AGE            INT     NOT NULL," \
      "ADDRESS        CHAR(50)," \
      "SALARY         REAL );";

   /* Execute SQL statement */
   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, "Table created successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

Ketika program di atas dikompilasi dan dijalankan, itu akan membuat tabel PERUSAHAAN di test.db Anda dan daftar akhir dari file tersebut adalah sebagai berikut -

-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

Operasi INSERT

Segmen kode C berikut menunjukkan bagaimana Anda dapat membuat catatan dalam tabel PERUSAHAAN yang dibuat pada contoh di atas -

#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;

   /* Open database */
   rc = sqlite3_open("test.db", &db);
   
   if( rc ) {
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Opened database successfully\n");
   }

   /* Create SQL statement */
   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 );";

   /* Execute SQL statement */
   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, "Records created successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

Ketika program di atas dikompilasi dan dijalankan, itu akan membuat catatan yang diberikan dalam tabel PERUSAHAAN dan akan menampilkan dua baris berikut -

Opened database successfully
Records created successfully

PILIH Operasi

Sebelum melanjutkan dengan contoh aktual untuk mengambil record, mari kita lihat beberapa detail tentang fungsi callback, yang kita gunakan dalam contoh kita. Callback ini menyediakan cara untuk mendapatkan hasil dari pernyataan SELECT. Ini memiliki deklarasi berikut -

typedef int (*sqlite3_callback)(
   void*,    /* Data provided in the 4th argument of sqlite3_exec() */
   int,      /* The number of columns in row */
   char**,   /* An array of strings representing fields in the row */
   char**    /* An array of strings representing column names */
);

Jika callback di atas disediakan dalam rutin sqlite_exec () sebagai argumen ketiga, SQLite akan memanggil fungsi callback ini untuk setiap record yang diproses di setiap pernyataan SELECT yang dieksekusi dalam argumen SQL.

Segmen kode C berikut menunjukkan bagaimana Anda dapat mengambil dan menampilkan catatan dari tabel PERUSAHAAN yang dibuat pada contoh di atas -

#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";

   /* Open database */
   rc = sqlite3_open("test.db", &db);
   
   if( rc ) {
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Opened database successfully\n");
   }

   /* Create SQL statement */
   sql = "SELECT * from COMPANY";

   /* Execute SQL statement */
   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;
}

Ketika program di atas dikompilasi dan dijalankan, maka akan menghasilkan hasil sebagai berikut.

Opened database successfully
Callback function called: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 20000.0

Callback function called: ID = 2
NAME = Allen
AGE = 25
ADDRESS = Texas
SALARY = 15000.0

Callback function called: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0

Callback function called: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0

Operation done successfully

UPDATE Operasi

Segmen kode C berikut menunjukkan bagaimana kita dapat menggunakan pernyataan UPDATE untuk memperbarui catatan apa pun dan kemudian mengambil dan menampilkan catatan yang diperbarui dari tabel PERUSAHAAN.

#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";

   /* Open database */
   rc = sqlite3_open("test.db", &db);
   
   if( rc ) {
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Opened database successfully\n");
   }

   /* Create merged SQL statement */
   sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1; " \
         "SELECT * from COMPANY";

   /* Execute SQL statement */
   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;
}

Ketika program di atas dikompilasi dan dijalankan, maka akan menghasilkan hasil sebagai berikut.

Opened database successfully
Callback function called: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 25000.0

Callback function called: ID = 2
NAME = Allen
AGE = 25
ADDRESS = Texas
SALARY = 15000.0

Callback function called: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0

Callback function called: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0

Operation done successfully

HAPUS Operasi

Mengikuti segmen kode C menunjukkan bagaimana Anda dapat menggunakan pernyataan DELETE untuk menghapus rekaman apa pun dan kemudian mengambil dan menampilkan rekaman yang tersisa dari tabel PERUSAHAAN.

#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";

   /* Open database */
   rc = sqlite3_open("test.db", &db);
   
   if( rc ) {
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Opened database successfully\n");
   }

   /* Create merged SQL statement */
   sql = "DELETE from COMPANY where ID=2; " \
         "SELECT * from COMPANY";

   /* Execute SQL statement */
   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;
}

Ketika program di atas dikompilasi dan dijalankan, maka akan menghasilkan hasil sebagai berikut.

Opened database successfully
Callback function called: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 20000.0

Callback function called: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0

Callback function called: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0

Operation done successfully