Computer >> Máy Tính >  >> Lập trình >> lập trình C

SQL sử dụng C / C ++ và SQLite

Trong phần này, bạn sẽ học cách sử dụng SQLite trong các chương trình C / C ++.

Cài đặt

Trước khi bắt đầu sử dụng SQLite trong các chương trình C / C ++ của chúng tôi, bạn cần đảm bảo rằng bạn đã thiết lập thư viện SQLite trên máy. Bạn có thể xem chương Cài đặt SQLite để hiểu quá trình cài đặt.

API giao diện C / C ++

Sau đây là các quy trình giao diện C / C ++ SQLite quan trọng, có thể đáp ứng đủ yêu cầu của bạn để làm việc với cơ sở dữ liệu SQLite từ chương trình C / C ++ của bạn. Nếu bạn đang tìm kiếm một ứng dụng phức tạp hơn, thì bạn có thể xem tài liệu chính thức của SQLite.

Số sê-ri API &Mô tả
1
sqlite3_open(const char *filename, sqlite3 **ppDb)
Quy trình này mở một kết nối đến tệp cơ sở dữ liệu SQLite và trả về một đối tượng kết nối cơ sở dữ liệu sẽ được sử dụng bởi các quy trình SQLite khác.

Nếu tên tệp đối số là NULL hoặc ':memory:', sqlite3_open () sẽ tạo cơ sở dữ liệu trong bộ nhớ trong RAM chỉ kéo dài trong khoảng thời gian của phiên.

Nếu tên tệp không phải là NULL, sqlite3_open () cố gắng mở tệp cơ sở dữ liệu bằng cách sử dụng giá trị của nó. Nếu không có tệp nào có tên đó tồn tại, sqlite3_open () sẽ mở một tệp cơ sở dữ liệu mới có tên đó.
2
sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
Quy trình này cung cấp một cách nhanh chóng, dễ dàng để thực thi các lệnh SQL được cung cấp bởi đối số sql có thể bao gồm nhiều hơn một lệnh SQL.

Đây, đối số đầu tiên sqlite3 là một đối tượng cơ sở dữ liệu mở, sqlite_callback là một lệnh gọi lại mà dữ liệu là đối số đầu tiên và errmsg sẽ được trả về để ghi lại bất kỳ lỗi nào do quy trình này đưa ra.

Quy trình SQLite3_exec () phân tích cú pháp và thực thi mọi lệnh được đưa ra trong sql cho đến khi nó đến cuối chuỗi hoặc gặp lỗi.
3
sqlite3_close(sqlite3*)
Quy trình này đóng một kết nối cơ sở dữ liệu đã mở trước đó bằng một cuộc gọi tới sqlite3_open (). Tất cả các báo cáo đã chuẩn bị liên quan đến kết nối phải được hoàn thiện trước khi đóng kết nối.

Nếu bất kỳ truy vấn nào vẫn chưa được hoàn thành, sqlite3_close () sẽ trả về SQLITE_BUSY với thông báo lỗi Không thể đóng do các câu lệnh chưa được hoàn thành.

Kết nối với cơ sở dữ liệu

Đoạn mã C sau đây cho thấy cách kết nối với cơ sở dữ liệu hiện có. Nếu cơ sở dữ liệu không tồn tại, thì nó sẽ được tạo và cuối cùng một đối tượng cơ sở dữ liệu sẽ được trả về.

Mã mẫu

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

Đầu ra

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

Tạo bảng

Đoạn mã C sau sẽ được sử dụng để tạo bảng trong cơ sở dữ liệu đã tạo trước đó -

Mã mẫu

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

Đầu ra (Kiểm tra trạng thái tệp cơ sở dữ liệu):

-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

Thao tác Chèn

Đoạn mã C sau đây cho thấy cách bạn có thể tạo bản ghi trong bảng COMPANY được tạo trong ví dụ trên -

Mã mẫu

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

Đầu ra

Opened database successfully
Records created successfully

Hoạt động CHỌN

Trước khi tiếp tục với ví dụ thực tế để tìm nạp các bản ghi, chúng ta hãy xem xét một số chi tiết về hàm gọi lại, mà chúng ta đang sử dụng trong các ví dụ của mình. Lệnh gọi lại này cung cấp một cách để lấy kết quả từ các câu lệnh SELECT. Nó có khai báo sau -

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

Nếu hàm gọi lại ở trên được cung cấp trong quy trình sqlite_exec () làm đối số thứ ba, thì SQLite sẽ gọi hàm gọi lại này cho mỗi bản ghi được xử lý trong mỗi câu lệnh SELECT được thực thi trong đối số SQL.

Đoạn mã C sau đây cho thấy cách bạn có thể tìm nạp và hiển thị các bản ghi từ bảng COMPANY được tạo trong ví dụ trên -

Mã mẫu

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

Đầu ra

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