কম্পিউটার টিউটোরিয়াল

সি/সি++ ও SQLite ব্যবহার করে SQL ডেটাবেস কানেক্টিভিটি

এই সেকশনে আপনি শিখবেন কীভাবে সি/সি++ প্রোগ্রামে SQLite ব্যবহার করতে হয়।

ইনস্টলেশন

SQLite সি/সি++ প্রোগ্রামে ব্যবহার করার আগে নিশ্চিত করুন যে আপনার মেশিনে SQLite লাইব্রেরি সেটআপ করা আছে। ইনস্টলেশন প্রসেস জানতে SQLite Installation চ্যাপ্টার দেখুন।

C/C++ ইন্টারফেস API-ها

নিচে গুরুত্বপূর্ণ C/C++ SQLite ইন্টারফেস রুটিনগুলো দেওয়া আছে:

সি.নং API ও বর্ণনা
1
sqlite3_open(const char *filename, sqlite3 **ppDb)
এই রুটিন একটি SQLite ডেটাবেস ফাইলের সাথে কানেকশন খোলে এবং অন্যান্য SQLite রুটিন দ্বারা ব্যবহার করার জন্য একটি ডেটাবেস কানেকশন অবজেক্ট রিটার্ন করে।

যদি filename আর্গুমেন্ট NULL বা ':memory:' হয়, তবে sqlite3_open() RAM-এ একটি ইন-মেমোরি ডেটাবেস তৈরি করে যা শুধু সেশন টাইম পর্যন্ত থাকে।

যদি filename NULL না হয়, তবে sqlite3_open() সেটি খোলার চেষ্টা করে। যদি সে নামে ফাইল না থাকে, তবে নতুন ডেটাবেস ফাইল তৈরি করে।
2
sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
এই রুটিন SQL কমান্ড এক্সিকিউট করার জন্য কুইক ও ইজি উপায় দেয়। sql আর্গুমেন্টে একাধিক SQL কমান্ড থাকতে পারে।

এখানে প্রথম আর্গুমেন্ট sqlite3 একটি ওপেন ডেটাবেস অবজেক্ট, sqlite_callback একটি কলব্যাক যার জন্য data প্রথম আর্গুমেন্ট এবং errmsg রুটিন দ্বারা উত্পন্ন এরর ক্যাপচার করবে।

sqlite3_exec() রুটিন sql আর্গুমেন্টে দেওয়া প্রতিটি কমান্ড পার্স ও এক্সিকিউট করে যতক্ষণ না স্ট্রিংয়ের শেষ পাওয়া যায় বা এরর দেখা যায়।
3
sqlite3_close(sqlite3*)
এই রুটিন sqlite3_open() দিয়ে পূর্বে খোলা ডেটাবেস কানেকশন বন্ধ করে। কানেকশন বন্ধ করার আগে সব প্রিপেয়ার্ড স্টেটমেন্ট ফাইনালাইজ করা উচিত।

যদি কোনো কোয়েরি ফাইনালাইজড না থাকে, তবে sqlite3_close() SQLITE_BUSY রিটার্ন করবে এরর মেসেজসহ।

ডেটাবেস কানেক্ট করা

নিচের সি কোড সেগমেন্ট দেখায় কীভাবে একটি এক্সিস্টিং ডেটাবেসের সাথে কানেক্ট করতে হয়। যদি ডেটাবেস না থাকে, তবে এটি তৈরি হবে এবং একটি ডেটাবেস অবজেক্ট রিটার্ন করবে।

উদাহরণ কোড: কানেক্ট

#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

টেবিল তৈরি করা (Create Table)

#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 Operation)

/* ... ähnlicher Code ... */
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 Operation)

কলব্যাক ফাংশন SELECT স্টেটমেন্ট থেকে রেজাল্ট পাওয়ার வழি প্রদান করে। এর ডিক্লেয়ারেশন:

typedef int (*sqlite3_callback)(
    void*, /* sqlite3_exec()-এর ৪র্থ আর্গুমেন্টে প্রদত্ত ডেটা */
    int,   /* রোয়ের কলাম সংখ্যা */
    char**, /* রোয়ের ফিল্ডগুলো রিপ্রেজেন্ট করে স্ট্রিং অ্যারে */
    char**  /* কলামের নামগুলো রিপ্রেজেন্ট করে স্ট্রিং অ্যারে */
);

এই কলব্যাক sqlite3_exec()-এ থার্ড আর্গুমেন্ট হিসেবে দিয়ে থাকলে, SQL আর্গুমেন্টে এক্সিকিউট হওয়া প্রতিটি SELECT স্টেটমেন্টের প্রতিটি রেকর্ড প্রসেস হওয়ার জন্য SQLite এই কলব্যাক ফাংশন কল করবে।

উদাহরণ কোড: SELECT

#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";
    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");
    }
    sql = "SELECT * from COMPANY";
    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;
}

আউটপুট

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
  1. সি/সি++-এ exit(), abort() ও assert()

  2. সি/সি++-এ strdup() ও strndup()

  3. C++-এ DNF অ্যালগরিদম দিয়ে ০, ১, ২ সর্ট করা

  4. পাইথনে SQLite ডাটাবেস ব্যবহার করে SQL অপারেশন