SQLite - C / C ++

Bu bölümde, C / C ++ programlarında SQLite'ı nasıl kullanacağınızı öğreneceksiniz.

Kurulum

C / C ++ programlarımızda SQLite kullanmaya başlamadan önce, makinede SQLite kitaplığının kurulu olduğundan emin olmanız gerekir. Kurulum sürecini anlamak için SQLite Kurulum bölümüne bakabilirsiniz.

C / C ++ Arayüz API'leri

Aşağıdakiler, C / C ++ programınızdan SQLite veritabanı ile çalışma gereksiniminizi karşılayabilecek önemli C / C ++ SQLite arayüz rutinleri. Daha karmaşık bir uygulama arıyorsanız, SQLite resmi belgelerine bakabilirsiniz.

Sr.No. API ve Açıklama
1

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

Bu rutin, bir SQLite veritabanı dosyasına bir bağlantı açar ve diğer SQLite rutinleri tarafından kullanılacak bir veritabanı bağlantı nesnesi döndürür.

Eğer dosya ': bellek:', sqlite3_open () yalnızca oturum boyunca sürer RAM'da bir bellek veritabanı oluşturur bağımsız değişken NULL veya daha azdır.

Dosya adı NULL değilse, sqlite3_open () veritabanı dosyasını değerini kullanarak açmaya çalışır. Bu isimde bir dosya yoksa, sqlite3_open () bu isimde yeni bir veritabanı dosyası açacaktır.

2

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

Bu rutin, birden fazla SQL komutundan oluşabilen sql argümanı tarafından sağlanan SQL komutlarını yürütmenin hızlı ve kolay bir yolunu sağlar.

Burada, ilk argüman sqlite3 bir açık veritabanı nesnesidir, sqlite_callback , verinin 1. argüman olduğu bir geri çağrıdır ve rutin tarafından ortaya çıkan herhangi bir hatayı yakalamak için errmsg döndürülür.

SQLite3_exec () rutini, içinde verilen her komutu ayrıştırır ve yürütür. sql argüman dizenin sonuna ulaşana veya bir hatayla karşılaşana kadar.

3

sqlite3_close(sqlite3*)

Bu rutin, daha önce sqlite3_open () çağrısı ile açılmış olan bir veritabanı bağlantısını kapatır. Bağlantı ile ilgili hazırlanan tüm ifadeler, bağlantı kapatılmadan önce sonuçlandırılmalıdır.

Sonlandırılmamış herhangi bir sorgu kalırsa, sqlite3_close (), sonlandırılmamış ifadeler nedeniyle kapatılamıyor hata mesajıyla SQLITE_BUSY döndürür.

Veritabanına Bağlan

Aşağıdaki C kodu bölümü, mevcut bir veritabanına nasıl bağlanılacağını gösterir. Veritabanı yoksa, o zaman oluşturulur ve son olarak bir veritabanı nesnesi döndürülür.

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

Şimdi, veritabanımızı oluşturmak için yukarıdaki programı derleyip çalıştıralım. test.dbmevcut dizinde. Yolunuzu ihtiyacınıza göre değiştirebilirsiniz.

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

C ++ kaynak kodunu kullanacaksanız, kodunuzu aşağıdaki gibi derleyebilirsiniz -

$g++ test.c -l sqlite3

Burada, C programına gerekli fonksiyonları sağlamak için programımızı sqlite3 kütüphanesi ile ilişkilendiriyoruz. Bu dizininizde bir veritabanı dosyası test.db oluşturur ve aşağıdaki sonucu alırsınız.

-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

Tablo Oluşturun

Aşağıdaki C kodu segmenti, önceden oluşturulan veritabanında bir tablo oluşturmak için kullanılacaktır -

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

Yukarıdaki program derlendiğinde ve çalıştırıldığında, test.db'nizde ŞİRKET tablosu oluşturacak ve dosyanın son listesi aşağıdaki gibi olacaktır -

-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 İşlemi

Aşağıdaki C kodu segmenti, yukarıdaki örnekte oluşturulan COMPANY tablosunda nasıl kayıt oluşturabileceğinizi gösterir -

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

Yukarıdaki program derlendiğinde ve çalıştırıldığında, verilen kayıtları ŞİRKET tablosunda oluşturacak ve aşağıdaki iki satırı görüntüleyecektir -

Opened database successfully
Records created successfully

SELECT İşlemi

Kayıtları almak için gerçek bir örnekle devam etmeden önce, örneklerimizde kullandığımız geri arama işlevi hakkında bazı ayrıntılara bakalım. Bu geri arama, SELECT deyimlerinden sonuçlar elde etmenin bir yolunu sağlar. Aşağıdaki beyanı vardır -

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 */
);

Yukarıdaki geri çağırma, üçüncü bağımsız değişken olarak sqlite_exec () yordamında sağlanırsa, SQLite, SQL bağımsız değişkeni içinde yürütülen her bir SELECT deyiminde işlenen her kayıt için bu geri arama işlevini çağırır.

Aşağıdaki C kodu segmenti, yukarıdaki örnekte oluşturulan COMPANY tablosundaki kayıtları nasıl getirip görüntüleyebileceğinizi gösterir -

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

Yukarıdaki program derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verecektir.

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

GÜNCELLEME İşlemi

Aşağıdaki C kodu segmenti, herhangi bir kaydı güncellemek için UPDATE ifadesini nasıl kullanabileceğimizi ve ardından COMPANY tablosundan güncellenmiş kayıtları alıp görüntüleyebileceğimizi gösterir.

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

Yukarıdaki program derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verecektir.

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

DELETE İşlemi

Aşağıdaki C kodu segmenti, herhangi bir kaydı silmek için DELETE ifadesini nasıl kullanabileceğinizi ve sonra kalan kayıtları COMPANY tablosundan alıp görüntüleyebileceğinizi gösterir.

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

Yukarıdaki program derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verecektir.

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