কম্পিউটার

SQL C/C++ এবং SQLite ব্যবহার করে


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

ইনস্টলেশন

আপনি আমাদের C/C++ প্রোগ্রামগুলিতে SQLite ব্যবহার শুরু করার আগে, আপনাকে নিশ্চিত করতে হবে যে আপনার মেশিনে SQLite লাইব্রেরি সেট আপ করা আছে। ইনস্টলেশন প্রক্রিয়া বুঝতে আপনি SQLite ইনস্টলেশন অধ্যায় পরীক্ষা করতে পারেন।

C/C++ ইন্টারফেস APIs

নিম্নলিখিত গুরুত্বপূর্ণ C/C++ SQLite ইন্টারফেস রুটিনগুলি রয়েছে, যা আপনার C/C++ প্রোগ্রাম থেকে SQLite ডাটাবেসের সাথে কাজ করার জন্য আপনার প্রয়োজনীয়তা পূরণ করতে পারে। আপনি যদি আরও পরিশীলিত অ্যাপ্লিকেশন খুঁজছেন, তাহলে আপনি SQLite অফিসিয়াল ডকুমেন্টেশন দেখতে পারেন।

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

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

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

এখানে, প্রথম যুক্তি sqlite3 একটি ওপেন ডাটাবেস অবজেক্ট, sqlite_callback হল একটি কল ব্যাক যার জন্য ডেটা হল ১ম আর্গুমেন্ট এবং রুটিন দ্বারা উত্থাপিত যেকোন ত্রুটি ক্যাপচার করতে 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);
}

আউটপুট

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

টেবিল তৈরি করুন

পূর্বে তৈরি করা ডাটাবেসে একটি টেবিল তৈরি করতে নিম্নলিখিত C কোড সেগমেন্ট ব্যবহার করা হবে −

উদাহরণ কোড

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

আউটপুট (ডাটাবেস ফাইলের স্থিতি পরীক্ষা করুন):

-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

অপারেশন সন্নিবেশ করান

নিম্নলিখিত সি কোড সেগমেন্ট দেখায় কিভাবে আপনি উপরের উদাহরণে তৈরি কোম্পানি টেবিলে রেকর্ড তৈরি করতে পারেন –

উদাহরণ কোড

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

আউটপুট

Opened database successfully
Records created successfully

অপারেশন নির্বাচন করুন

রেকর্ডগুলি আনার জন্য প্রকৃত উদাহরণের সাথে এগিয়ে যাওয়ার আগে, আসুন কলব্যাক ফাংশন সম্পর্কে কিছু বিশদ বিবরণ দেখি, যা আমরা আমাদের উদাহরণগুলিতে ব্যবহার করছি। এই কলব্যাক SELECT স্টেটমেন্ট থেকে ফলাফল পাওয়ার উপায় প্রদান করে। এটিতে নিম্নলিখিত ঘোষণা রয়েছে –

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

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

নিম্নলিখিত সি কোড সেগমেন্ট দেখায় যে আপনি কীভাবে উপরের উদাহরণে তৈরি কোম্পানি টেবিল থেকে রেকর্ডগুলি আনতে এবং প্রদর্শন করতে পারেন –

উদাহরণ কোড

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

আউটপুট

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. C/C++ এ exit(), abort() এবং assert()

  2. strdup() এবং strdndup() C/C++ এ

  3. C++ ব্যবহার করে 0, 1 এবং 2 এর অ্যারে সাজান

  4. পাইথন এবং SQLite ব্যবহার করে এসকিউএল