Tutorial klasik...LOG MASUK
Tutorial klasik SQLite
pengarang:php.cn  masa kemas kini:2022-04-13 17:05:02

SQLite - C/C++


Pemasangan

Sebelum menggunakan SQLite dalam program C/C++, kita perlu memastikan bahawa sudah ada perpustakaan SQLite pada mesin. Anda boleh melihat bab pemasangan SQLite untuk proses pemasangan.

API Antara Muka C/C++

Berikut ialah program antara muka C&C++ / SQLite yang penting yang boleh memenuhi keperluan anda untuk menggunakan pangkalan data SQLite dalam program C/C++. Jika anda memerlukan butiran lanjut, lihat dokumentasi rasmi SQLite.

Nombor siriAPI & Penerangan
1sqlite3_open(const char *nama fail, sqlite3 **ppDb)
序号API & 描述
1sqlite3_open(const char *filename, sqlite3 **ppDb)

该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。

如果 filename 参数是 NULL 或 ':memory:',那么 sqlite3_open() 将会在 RAM 中创建一个内存数据库,这只会在 session 的有效时间内持续。

如果文件名 filename 不为 NULL,那么 sqlite3_open() 将使用这个参数值尝试打开数据库文件。如果该名称的文件不存在,sqlite3_open() 将创建一个新的命名为该名称的数据库文件并打开。

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

该例程提供了一个执行 SQL 命令的快捷方式,SQL 命令由 sql 参数提供,可以由多个 SQL 命令组成。

在这里,第一个参数 sqlite3 是打开的数据库对象,sqlite_callback 是一个回调,data 作为其第一个参数,errmsg 将被返回用来获取程序生成的任何错误。

sqlite3_exec() 程序解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止。

3sqlite3_close(sqlite3*)

该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。

如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。

Rutin ini membuka fail yang menunjuk ke Sambungan pangkalan data SQLite, mengembalikan objek sambungan pangkalan data yang digunakan oleh program SQLite lain. <🎜><🎜>Jika parameter filename ialah NULL atau ':memory:', maka sqlite3_open() akan mencipta pangkalan data dalam memori dalam RAM, yang hanya akan bertahan untuk masa sah sesi. <🎜><🎜>Jika nama fail bukan NULL, maka sqlite3_open() akan menggunakan nilai parameter ini untuk cuba membuka fail pangkalan data. Jika fail dengan nama itu tidak wujud, sqlite3_open() akan mencipta fail pangkalan data baharu dengan nama itu dan membukanya. <🎜>
2sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)< /strong>
<🎜>Rutin ini menyediakan jalan pintas untuk melaksanakan perintah SQL yang disediakan oleh parameter sql dan boleh terdiri daripada berbilang arahan SQL. <🎜><🎜>Di sini, parameter pertama sqlite3 ialah objek pangkalan data yang dibuka, sqlite_callback ialah panggilan balik dan data ialah parameter ketiganya . Satu hujah, errmsg akan dikembalikan untuk menangkap sebarang ralat yang dihasilkan oleh program. Program <🎜><🎜>sqlite3_exec() menghuraikan dan melaksanakan setiap arahan yang diberikan oleh parameter sql sehingga penghujung rentetan atau ralat ditemui. <🎜>
3sqlite3_close(sqlite3*)
<🎜>Rutin ini dipanggil sebelum ditutup Sambungan pangkalan data dibuka oleh sqlite3_open(). Semua pernyataan berkaitan sambungan hendaklah dilengkapkan sebelum sambungan ditutup. <🎜><🎜>Jika masih terdapat pertanyaan yang belum diselesaikan, sqlite3_close() akan mengembalikan mesej ralat SQLITE_BUSY yang melarang penutupan. <🎜>

Menyambung ke pangkalan data

Coretan kod C berikut menunjukkan cara menyambung ke pangkalan data sedia ada. Jika pangkalan data tidak wujud, ia akan dibuat dan objek pangkalan data 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));
      exit(0);
   }else{
      fprintf(stderr, "Opened database successfully\n");
   }
   sqlite3_close(db);
}

Sekarang, mari kita susun dan jalankan atur cara di atas untuk mencipta pangkalan data kami test.db dalam direktori semasa. Anda boleh menukar laluan mengikut keperluan.

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

Jika anda ingin menggunakan kod sumber C++, anda boleh menyusun kod seperti berikut:

$g++ test.c -l sqlite3

Di sini, pautkan program kami dengan perpustakaan sqlite3 untuk menyediakan fungsi yang diperlukan kepada program C. Ini akan mencipta fail pangkalan data test.db dalam direktori anda dan anda akan mendapat hasil 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

Cipta jadual

Coretan kod C berikut akan digunakan dalam pangkalan data yang dibuat sebelum ini. jadual:

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

Apabila atur cara di atas disusun dan dilaksanakan, ia akan mencipta jadual SYARIKAT dalam fail test.db, dan senarai fail akhir kelihatan seperti ini:

-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

Coretan kod C berikut menunjukkan cara membuat rekod dalam jadual SYARIKAT yang dibuat 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));
      exit(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;
}

Apabila atur cara di atas disusun dan dilaksanakan, ia akan mencipta rekod yang diberikan dalam jadual SYARIKAT dan akan memaparkan dua Baris berikut:

Opened database successfully
Records created successfully

PILIH operasi

Sebelum kita mula menerangkan contoh mendapatkan rekod, mari kita fahami beberapa butiran fungsi panggil balik, yang akan digunakan dalam contoh kita . Panggilan balik ini menyediakan cara untuk mendapatkan hasil daripada pernyataan SELECT. Ia diisytiharkan seperti 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 panggilan balik di atas digunakan sebagai parameter ketiga dalam prosedur sqlite_exec(), maka SQLite akan memanggil fungsi panggil balik ini untuk setiap rekod yang diproses dalam setiap pernyataan SELECT yang dilaksanakan dalam parameter SQL .

Coretan kod C berikut menunjukkan cara untuk mendapatkan dan memaparkan rekod daripada jadual SYARIKAT yang dibuat sebelum ini:

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

Apabila atur cara di atas menyusun dan melaksanakan, ia menghasilkan keputusan 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

Kemas kini Operasi

Coretan kod C berikut menunjukkan cara menggunakan pernyataan KEMASKINI untuk mengemas kini sebarang rekod dan kemudian mendapatkan dan memaparkan rekod yang dikemas kini daripada jadual SYARIKAT:

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

Atur cara di atas compiles dan Apabila dilaksanakan, ia menghasilkan keputusan 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

Operasi PADAM

Coretan kod C berikut menunjukkan cara untuk memadam sebarang rekod menggunakan pernyataan DELETE dan kemudian dapatkan dan paparkan rekod yang tinggal daripada jadual SYARIKAT :

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

Apabila atur cara di atas disusun dan dilaksanakan, ia menghasilkan hasil 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

Laman web PHP Cina