Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

การเชื่อมต่อฐานข้อมูลด้วย C/C++ (SQLite)

การติดตั้ง

ต้องมี SQLite library ติดตั้งบนเครื่อง (ดูรายละเอียดในบท SQLite Installation)

C/C++ Interface APIs

ลำดับAPI & คำอธิบาย
1
sqlite3_open(const char *filename, sqlite3 **ppDb)
เปิดการเชื่อมต่อไฟล์ฐานข้อมูล SQLite คืน connection object สำหรับ routine อื่นๆ
ถ้า filename เป็น NULL หรือ ':memory:' → สร้าง in-memory database ใน RAM
ถ้าไฟล์ไม่มี → สร้างไฟล์ใหม่
2
sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
รันคำสั่ง SQL หลายคำสั่งพร้อมกัน
sqlite3 = open database object, callback เรียกต่อแถว, errmsg เก็บ error
3
sqlite3_close(sqlite3*)
ปิดการเชื่อมต่อที่เปิดด้วย sqlite3_open() ต้อง finalize prepared statements ก่อน

เชื่อมต่อฐานข้อมูล

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

ผลลัพธ์

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

สร้างตาราง

#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, "Can't open database: %s\n", sqlite3_errmsg(db));
        return 0;
    } else {
        fprintf(stdout, "Opened database successfully\n");
    }
    sql = "CREATE TABLE COMPANY("
          "ID INT PRIMARY KEY NOT NULL,"
          "NAME TEXT NOT NULL,"
          "AGE INT NOT NULL,"
          "ADDRESS CHAR(50),"
          "SALARY REAL );";
    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;
}

ผลลัพธ์ (ตรวจสอบไฟล์)

-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 ข้อมูล

/* ... ส่วนเชื่อมต่อเหมือนเดิม ... */
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 );";
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
/* ... error handling ... */
fprintf(stdout, "Records created successfully\n");
sqlite3_close(db);

ผลลัพธ์

Opened database successfully
Records created successfully

SELECT ข้อมูล

Callback function ใช้รับผลลัพธ์จาก SELECT:

typedef int (*sqlite3_callback)(void*, int, char**, char**);

ถ้าใส่ callback ใน sqlite3_exec() จะถูกเรียกทุกแถวของ SELECT

ตัวอย่าง SELECT

/* ... ส่วนเชื่อมต่อ ... */
sql = "SELECT * from COMPANY";
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
/* ... error handling ... */
fprintf(stdout, "Operation done successfully\n");
sqlite3_close(db);

ผลลัพธ์

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