English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C / C ++ SQLite

في هذا الفصل، ستتعلم كيفية استخدام SQLite في برنامج C / C ++.

التثبيت

قبل بدء استخدام SQLite في برنامج C / C ++ الخاص بك، يجب التأكد من أن مكتبة SQLite مثبتة على جهاز الكمبيوتر. يمكنك الرجوع إلى فصل 'تثبيت SQLite' لمعرفة عملية التثبيت.

واجهات API لـ C / C ++

فيما يلي أمثلة مهمة لواجهات C / C ++ لـ SQLite، والتي تكفي لتلبية احتياجاتك من استخدام قاعدة بيانات SQLite في برنامج C / C ++. إذا كنت تبحث عن تطبيقات أكثر تعقيدًا، يمكنك الرجوع إلى وثائق SQLite الرسمية.

الترقيمAPI وشرح
1

sqlite3_open(const char *filename, sqlite3 **ppDb)

هذا البرنامج يفتح اتصالاً بملف قاعدة البيانات SQLite ويقوم بتقديم ملف اتصال قاعدة البيانات لاستخدامه في برامج SQLite الأخرى.

إذاfilenameإذا كان المعامل 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.

في\nهذا،\nالمسؤول\nالأولsqlite3هو\nمفهوم\nقاعدة\ndata\nمفتوحة،\nsqlite_callbackهو\nالإجراء،\nوdataهو\nالمسؤول\nالأول،\nوسيقوم\nبالإرجاع\nerrmsg\nلإلتقاط\ناقدررور\nالوحدة\n.

يحلل\nو ينفذ\nوحدة\nsqlite3_exec()sqlكل\nالأوامر\nالمحددة\ناقطع\nالمحدد،\nحتى\nوصول\nالنهاية\nللخط\nأو\nإيجاد\nخطأ

3

sqlite3_close(sqlite3*)

هذا\nالبرنامج\nيقوم\nبإغلاق\nالجلسة\nالسابقة\nللجلسة\nالسابقة\nمفتوحة\ناقاعدة\ndata\nمن خلال\nالإتصال\nsqlite3_open()\n. يجب\nإكمال\ناقدارات\nالجمل\nالجاهزة\nقبل\nإغلاق\nالجلسة\n.

إذا\nكان\nهنالك\nاستعلامات\nلم\nتتم\nعلى\nها، فإن\nsqlite3_close()\nسيقوم\nبالإرجاع\nSQLITE_BUSY،\nرسالة\nالخطأ\nلا\nيمكن\nإغلاق\nالجلسة\nبسبب\nالجمل\nاللم\nتتم\nعلى\nها

الاتصال\ناقاعدة\ndata

البرنامج\nC\nالتالي\nيظهر\nكيفية\nالاتصال\ناقدرة\nقاعدة\ndata\nموجودة\n. إذا\nلم\nتكون\nقاعدة\ndata\n موجودة، سيتم\nإنشاء\ناقاعدة\ndata\n، وأخيرًا سيتم\nإرجاع\nمفهوم\nقاعدة\ndata\n.

#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, "تعذر فتح قاعدة البيانات: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "\nفتح\nقاعدة\ndata\nالمستحقة\n");
   }
   sqlite3_close(db);
}

الآن، دعونا\nنقوم\nبترجمة\nونفيذ\nالبرنامج\nالسابق\n-test.dbإنشاء\nقاعدة\ndata\nin\ncurrent\nfolder\n. يمكنك\nتغيير\nالمسار\nحسب\nالحاجة\n.

$gcc test.c -l sqlite3
$./a.out
فتح\nقاعدة\ndata\nالمستحقة

إذا\nكنت\nتريد\nاستخدام\ncode\nC++\n، يمكنك\nترجمة\ncode\nبالتالي\n-

$g++ test.c -l sqlite3

في\nهذا\n، سنقوم\nبإرتباط\nالبرنامج\nب مكتبة\nsqlite3\nلإتاحة\nالميزات\nالتي\nتطلبها\nبرنامج\nC\n، سيتم\nإنشاء\nملف\ndatabase\ntest.db\nفي\nمجلد\nyour\n، وستحصل\nعلى\nالنتيجة\nالتالية\n.

-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

إنشاء\ntable

البرنامج\nC\nالتالي\nسيتم\nاستخدامه\nلإنشاء\ntable\nفي\nقاعدة\ndata\nالسابقة\n-

#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;
   /*\nفتح\nقاعدة\ndata\n*/
   rc = sqlite3_open("test.db", &db);   
   if( rc ) {
      fprintf(stderr, "تعذر فتح قاعدة البيانات: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stdout, "\nالبيانات\n");
   }
   /*إنشاء جملة SQL*/
   sql = "CREATE TABLE COMPANY("  \
      "ID INT PRIMARY KEY     NOT NULL," \
      "NAME           TEXT    NOT NULL, " \
      "AGE            INT     NOT NULL, " \
      "ADDRESS        CHAR(50)," \
      "SALARY         REAL );"
   /* تنفيذ جملة SQL */
   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
   
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "خطأ SQL: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "تم إنشاء الجدول بنجاح\n");
   }
   sqlite3_close(db);
   return 0;
}

بعد تجميع وتنفيذ البرنامج المذكور أعلاه، سيتم إنشاء جدول COMPANY في test.db، والقائمة النهائية للملفات ستكون كالتالي -

-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

عملية إدراج

أما هذا جزء من البرنامج بلغة C فإنه يوضح كيفية إنشاء سجلات في جدول COMPANY الذي تم إنشاؤه في المثال السابق -

#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, "تعذر فتح قاعدة البيانات: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "تم فتح قاعدة البيانات بنجاح\n");
   }
   /*إنشاء جملة SQL*/
   sql = "إدراج INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
         "قيم (1, 'Paul', 32, 'California', 20000.00 ); " \
         "إدراج INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
         "قيم (2, 'Allen', 25, 'Texas', 15000.00 ); " \
         "إدراج INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
         "قيم (3, 'Teddy', 23, 'Norway', 20000.00 ); " \
         "إدراج INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
         "قيم (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );"
   /* تنفيذ جملة SQL */
   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
   
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "خطأ SQL: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "تم إنشاء السجل بنجاح\n");
   }
   sqlite3_close(db);
   return 0;
}

بعد تجميع وتنفيذ البرنامج المذكور أعلاه، سيتم إنشاء السجل المحدد في جدول COMPANY وعرض الخطوط التالية-

تم فتح قاعدة البيانات بنجاح
تم إنشاء السجل بنجاح

عملية التحديد

قبل أن نبدأ في المثال الفعلي للحصول على السجلات، دعونا نرى بعض التفاصيل المتعلقة بوظائف التدفق في المثال. توفر وظيفة التدفق طريقة للحصول على النتائج من جملة SELECT. وهي تحتوي على التصريح التالي-

typedef int (*sqlite3_callback)(
   void*, /*تمثل البيانات التي يتم تقديمها في الرابع معامل sqlite3_exec()*/
   int, /*عدد العناوين في السطر*/
   char**, /*تمثل مصفوفة من الأسماء النصية للعناصر في السطر*/
   char** /*تمثل مصفوفة من الأسماء النصية للعناوين*/
);

إذا تم تقديم هذا التدفق المكتوب كثالث معامل في إجراء sqlite_exec()، فإن SQLite سيقوم بدعوة هذه الوظيفة المكتوبة لكل سجل يتم معالجته في كل جملة SELECT يتم تنفيذها داخل SQL.

الكترونيات C التالية تظهر كيفية الحصول على السجلات من جدول COMPANY المُنشأ في المثال السابق وعرضها-

#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 = "تم استدعاء وظيفة التشغيل";
   /* فتح قاعدة البيانات */
   rc = sqlite3_open("test.db", &db);   
   if( rc ) {
      fprintf(stderr, "تعذر فتح قاعدة البيانات: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "تم فتح قاعدة البيانات بنجاح\n");
   }
   /*إنشاء جملة SQL*/
   sql = "SELECT * from COMPANY";
   /* تنفيذ جملة SQL */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
   
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "خطأ SQL: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "تم إكمال العملية بنجاح\n");
   }
   sqlite3_close(db);
   return 0;
}

بعد تجميع وتنفيذ البرنامج المذكور أعلاه، سيتم إنتاج النتيجة التالية.

تم فتح قاعدة البيانات بنجاح
تم استدعاء وظيفة التشغيل: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 20000.0
تم استدعاء وظيفة التدفق المكتوبة: ID = 2
NAME = Allen
AGE = 25
ADDRESS = Texas
SALARY = 15000.0
تم استدعاء وظيفة الرد: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0
تم استدعاء وظيفة الرد: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0
تم إكمال العملية بنجاح

عملية التحديث

الكترونيات C التالية تظهر كيفية استخدام جملة التحديث لتحديث أي سجل، ثم الحصول على السجلات المعدلة من جدول COMPANY وعرضها.

#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 = "تم استدعاء وظيفة التشغيل";
   /*فتح قاعدة البيانات*/
   rc = sqlite3_open("test.db", &db);   
   if( rc ) {
      fprintf(stderr, "تعذر فتح قاعدة البيانات: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "تم فتح قاعدة البيانات بنجاح\n");
   }
   /*إنشاء جملة SQL مدمجة*/
   sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1;" \
         "SELECT * from COMPANY";
   /* تنفيذ جملة SQL */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
   
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "خطأ SQL: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "تم إكمال العمل بنجاح\n");
   }
   sqlite3_close(db);
   return 0;
}

بعد تجميع وتنفيذ البرنامج المذكور أعلاه، سيتم إنتاج النتيجة التالية.

تم فتح قاعدة البيانات بنجاح
تم استدعاء وظيفة التشغيل: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 25000.0
تم استدعاء وظيفة التدفق المكتوبة: ID = 2
NAME = Allen
AGE = 25
ADDRESS = Texas
SALARY = 15000.0
تم استدعاء وظيفة الرد: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0
تم استدعاء وظيفة الرد: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0
تم إتمام العمل بنجاح

عملية الحذف

الكترونيات C التالية تظهر كيفية استخدام جملة الحذف ل�除 أي سجل، ثم الحصول على بقيته من جدول COMPANY وعرضه.

#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 = "تم استدعاء وظيفة التشغيل";
   /* فتح قاعدة البيانات */
   rc = sqlite3_open("test.db", &db);   
   if( rc ) {
      fprintf(stderr, "تعذر فتح قاعدة البيانات: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "تم فتح قاعدة البيانات بنجاح\n");
   }
   /* إنشاء جملة SQL مدمجة */
   sql = "DELETE from COMPANY where ID=2; " \
         "SELECT * from COMPANY";
   /* تنفيذ جملة SQL */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
   
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "خطأ SQL: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "تم إكمال العمل بنجاح\n");
   }
   sqlite3_close(db);
   return 0;
}

بعد تجميع وتنفيذ البرنامج المذكور أعلاه، سيتم إنتاج النتيجة التالية.

تم فتح قاعدة البيانات بنجاح
تم استدعاء وظيفة التشغيل: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 20000.0
تم استدعاء وظيفة الرد: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0
تم استدعاء وظيفة الرد: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0
تم إتمام العمل بنجاح