ToB企服应用市场:ToB评测及商务社交产业平台

标题: C/C++ 通过SQLiteSDK增删改查 [打印本页]

作者: 大连密封材料    时间: 2024-1-11 11:21
标题: C/C++ 通过SQLiteSDK增删改查
SQLite,作为一款嵌入式关系型数据库管理系统,一直以其轻量级、零配置以及跨平台等特性而备受青睐。不同于传统的数据库系统,SQLite是一个库,直接与应用程序一同编译和链接,无需单独的数据库服务器进程,实现了数据库的零配置管理。这种设计理念使得SQLite成为许多嵌入式系统、移动应用和小型项目中的首选数据库引擎。
SQLite的特点包括:
SQLite 数据库以其独特的自给自足特性脱颖而出,整个数据库被存储在一个单一的磁盘文件中,使得备份、复制或传输数据库变得异常简单。而作为一款开源项目,SQLite采用了公共领域授权,可以在商业和非商业项目中免费使用。
由于该数据库的小巧和简洁所以在使用上也非常容易,当读者下载好附件以后会看到如下图所示的文件;

使用时只需要将sqlite3.h与sqlite3.c文件导入到项目中并使用#include "sqlite3.h"即可,无需做其他配置,图中的sqlite3.dll是动态库,sqlite3.exe则是一个命令行版本的数据库可在测试时使用它。
打开与关闭库

sqlite3_open 用于打开或创建一个 SQLite 数据库文件。该函数的原型如下:
  1. int sqlite3_open(
  2.   const char *filename,   /* Database filename (UTF-8) */
  3.   sqlite3 **ppDb          /* OUT: SQLite db handle */
  4. );
复制代码
该函数返回一个整数值,代表函数的执行状态。如果函数成功执行,返回 SQLITE_OK。如果有错误发生,返回一个表示错误代码的整数值。可以通过 sqlite3_errmsg 函数获取更详细的错误信息。
sqlite3_close 用于关闭数据库连接的函数。其原型如下:
  1. int sqlite3_close(sqlite3*);
复制代码
该函数返回一个整数值,用于表示函数的执行状态。如果函数成功执行,返回 SQLITE_OK。如果有错误发生,返回一个表示错误代码的整数值。
使用 sqlite3_close 函数可以释放与数据库连接相关的资源,并确保数据库文件被正确关闭。在关闭数据库连接之前,应该确保已经完成了所有需要执行的 SQL 语句,并在需要的情况下检查执行结果。
  1. // 打开数据库并返回句柄
  2. sqlite3* open_database(std::string database_name)
  3. {
  4.   int ref =-1;
  5.   sqlite3 *db = 0;
  6.   ref = sqlite3_open(database_name.c_str(), &db);
  7.   if (ref == SQLITE_OK)
  8.     return db;
  9.   return false;
  10. }
  11. // 关闭数据库
  12. bool close_database(sqlite3 *db)
  13. {
  14.   int ref = sqlite3_close(db);
  15.   if (ref == SQLITE_OK)
  16.     return true;
  17.   return false;
  18. }
复制代码
执行查询语句

sqlite3_exec 用于执行 SQL 语句的高级接口函数。它的原型如下:
  1. int sqlite3_exec(
  2.   sqlite3* db,                    /* Database handle */
  3.   const char* sql,                /* SQL statement, UTF-8 encoded */
  4.   int (*callback)(                /* Callback function */
  5.     void*,                        /* Callback parameter */
  6.     int,                          /* Number of columns in the result set */
  7.     char**,                       /* Array of column values */
  8.     char**                        /* Array of column names */
  9.   ),
  10.   void* callback_param,           /* 1st argument to callback function */
  11.   char** errmsg                   /* Error msg written here */
  12. );
复制代码
sqlite3_exec 函数执行一个或多个 SQL 语句,并对每一条语句的执行结果调用指定的回调函数。回调函数的原型如下:
  1. int callback(
  2.   void* callback_param, /* 参数,由 sqlite3_exec 传递给回调函数 */
  3.   int num_columns,      /* 结果集中的列数 */
  4.   char** column_values,  /* 指向结果集中当前行的列值的数组 */
  5.   char** column_names    /* 指向结果集中列名的数组 */
  6. );
复制代码
回调函数返回一个整数,用于指示是否继续执行后续的 SQL 语句。如果回调函数返回非零值,sqlite3_exec 将停止执行 SQL,并立即返回。
sqlite3_prepare_v2 用于准备 SQL 语句的接口函数。它的原型如下:
  1. int sqlite3_prepare_v2(
  2.   sqlite3* db,            /* Database handle */
  3.   const char* sql,        /* SQL statement, UTF-8 encoded */
  4.   int sql_len,            /* Length of SQL statement in bytes, or -1 for zero-terminated */
  5.   sqlite3_stmt** stmt,    /* OUT: Statement handle */
  6.   const char** tail       /* OUT: Pointer to unused portion of SQL statement */
  7. );
复制代码
sqlite3_prepare_v2 函数用于将 SQL 语句编译成一个 SQLite 语句对象(prepared statement)。这个对象可以被多次执行,每次执行时可以绑定不同的参数。stmt 参数将用于存储编译后的语句的句柄,以供后续的操作。
sqlite3_step 执行预编译 SQL 语句的接口函数。它的原型如下:
  1. int sqlite3_step(sqlite3_stmt*);
复制代码
sqlite3_step 函数用于执行由 sqlite3_prepare_v2 预编译的 SQL 语句。在执行过程中,可以通过不断调用 sqlite3_step 来逐行获取查询结果,直到结果集结束。对于非查询语句(如 INSERT、UPDATE、DELETE),sqlite3_step 函数执行一次即可完成操作。
该函数的返回值表示执行的结果,可能的返回值包括:
sqlite3_column_text 用于获取查询结果集中某一列的文本值。其原型为:
  1. const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
复制代码
该函数返回指向字符串值的指针,该字符串值是查询结果集中指定列的文本表示。需要注意的是,返回的指针指向 SQLite 内部的存储区,应该在使用完之后尽早释放资源。
sqlite3_column_int 用于获取查询结果集中某一列的整数值。其原型为:
  1. int sqlite3_column_int(sqlite3_stmt*, int iCol);
复制代码
该函数返回查询结果集中指定列的整数表示。需要注意的是,如果该列不是整数类型,或者包含的数据无法转换为整数,那么返回的结果可能不是有效的整数值。
sqlite3_finalize 用于释放一个预备语句对象(prepared statement)。在使用 sqlite3_prepare_v2 函数准备 SQL 语句后,需要使用 sqlite3_finalize 来释放相应的语句对象。
该函数的原型为:
  1. int sqlite3_finalize(sqlite3_stmt *pStmt);
复制代码
该函数返回 SQLITE_OK 表示成功,返回其他错误码表示失败。
[code]// 执行SQL语句bool exec_sql(sqlite3 *db, char *sql){  char *error_code = 0;  int ref = sqlite3_exec(db, sql, 0, 0, &error_code);  if (ref == SQLITE_OK)  {    return true;  }  return false;}// 插入数据bool insert_data(sqlite3 *db, char *sql){  sqlite3_stmt *stmt = 0;  // 插入前检查语句合法性, -1自动计算SQL长度  int ref = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);  if (ref == SQLITE_OK)  {    sqlite3_step(stmt);       // 执行语句    sqlite3_finalize(stmt);   // 清理语句句柄    return true;  }  sqlite3_finalize(stmt);  return false;}// 查询数据集bool select_data(sqlite3 *db, char *sql){  sqlite3_stmt *stmt = 0;  int ref = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);  if (ref == SQLITE_OK)  {    // 每调一次sqlite3_step()函数,stmt就会指向下一条记录    while (sqlite3_step(stmt) == SQLITE_ROW)    {      // 取出第1列字段的值      const unsigned char *name = sqlite3_column_text(stmt, 1);            // 取出第2列字段的值      int age = sqlite3_column_int(stmt, 2);      std::cout




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4