sqlite库学习(8)sqlite插入与读取二进制

11 篇文章 0 订阅
11 篇文章 0 订阅

源码下载:https://download.csdn.net/download/no2101/12428235

1、插入

void DB_Insert_table_student(sqlite3 *db)

{

    int result         = -1;

    sqlite3_stmt *stat = 0;

    const char *pzTail = NULL;



    const char *sqls[] = {

         "insert into STUDENT(ID, name, picture) values(0, '张三', ?);",

         "insert into STUDENT(ID, name, picture) values(1, '李四', ?);"

    };

    const char *names[] = {

         "pic\\1.jpg",

         "pic\\2.jpg"

    };



    for (int j = 0; j < sizeof(sqls) / sizeof(char*); j++)

    {

         //准备 

         result = sqlite3_prepare(db, sqls[j], -1, &stat, &pzTail);



         if (!result && stat){

             FILE *file = NULL;

             fopen_s(&file, names[j], "rb+");

             char* data = NULL;

             long l_file_size = 0;

             if (file){

                  fseek(file, 0, SEEK_END);

                  l_file_size = ftell(file);

                  fseek(file, 0, SEEK_SET);

                  data = new char[l_file_size];

                  fread(data, 1, l_file_size, file);



                  //和sql的第一个?绑定(如果有多个问号,那就要分开绑定) 

                  result = sqlite3_bind_blob(stat, 1, data, l_file_size, NULL);



                  //将数据输入数据库 

                  if (sqlite3_step(stat) != SQLITE_DONE)

                  {

                      sqlite3_finalize(stat);

                      sqlite3_close(db);

                      return;

                  }

                  fclose(file);

                  delete[] data;

                  printf("Insert STUDENT Succeed.\n");

             }

         }

         //释放stat 

         sqlite3_finalize(stat);

    }

}

2、读取

void DB_Select_table_student(sqlite3 *db)

{

    char *sql = "SELECT * from STUDENT;";

    sqlite3_stmt * stmt3 = NULL;

    if (sqlite3_prepare_v2(db, sql, strlen(sql), &stmt3, NULL) != SQLITE_OK)

    {

         if (stmt3)

             sqlite3_finalize(stmt3);

         sqlite3_close(db);

         return;

    }

    int fieldCount = sqlite3_column_count(stmt3);//stmt3返回的是查询结果集

    char picname[100];

    do

    {

         int r = sqlite3_step(stmt3);

         if (r == SQLITE_ROW) {

             for (int i = 0; i < fieldCount; ++i) {

                  int vtype = sqlite3_column_type(stmt3, i);//字段类型获取

                                                               //const char* dtype = sqlite3_column_decltype(stmt3, i);//INT  REAL之类



                  const char* otype = sqlite3_column_origin_name(stmt3, i);//申明

                  printf("%s ", otype);

                  if (strcmp(otype, "name") == 0)

                  {

                      memset(picname, 0, 100);

                  }



                  //判断当前记录当前字段的类型,根据返回的类型使用不同的API函数

                  //获取实际的数据值                                      

                  if (vtype == SQLITE_INTEGER) {

                      int v = sqlite3_column_int(stmt3, i);

                      printf("is %d.\n", v);

                  }

                  else if (vtype == SQLITE_FLOAT) {

                      double v = sqlite3_column_double(stmt3, i);

                      printf("is %f.\n", v);

                  }

                  else if (vtype == SQLITE_TEXT) {

                      const char* v = (const char*)sqlite3_column_text(stmt3, i);

                      strcpy(picname, v);

                      printf("is %s.\n", v);

                  }

                  else if (vtype == SQLITE_BLOB)

                  {

                      const void* piblob = sqlite3_column_blob(stmt3, i);

                      int size = sqlite3_column_bytes(stmt3, i);

                      char total_name[256];

                      memset(total_name, 0, 256);

                      sprintf(total_name, "out_pic\\%s.jpg", picname);

                      FILE *f = fopen(total_name, "wb+");

                      fwrite(piblob, 1, size, f);

                      fclose(f);

                  }

                  else if (vtype == SQLITE_NULL) {

                      printf("is NULL.\n");

                  }

             }

         }

         else if (r == SQLITE_DONE) {

             printf("finish successfully\n");

             break;

         }

         else {

             printf("Failed to SELECT.\n");

             sqlite3_finalize(stmt3);

             sqlite3_close(db);

             return;

         }

         printf("\n");

    } while (true);

    printf("sqlite3_prepare_v2 student select done successfully\n");

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C++中更新SQLite3中的二进制数据,您可以使用SQLite3提供的BLOB类型。以下是一个简单的示例代码,它演示如何更新一个名为"my_table"的表中的二进制数据列"my_blob_column": ```c++ #include <sqlite3.h> #include <iostream> #include <fstream> using namespace std; int main() { // Open database sqlite3 *db; int rc = sqlite3_open("my_database.db", &db); if (rc != SQLITE_OK) { cerr << "Error opening database: " << sqlite3_errmsg(db) << endl; sqlite3_close(db); return 1; } // Read binary data from a file ifstream file("my_binary_data.bin", ios::binary | ios::ate); if (!file.is_open()) { cerr << "Error opening file." << endl; sqlite3_close(db); return 1; } streamsize size = file.tellg(); file.seekg(0, ios::beg); char *buffer = new char[size]; if (!file.read(buffer, size)) { cerr << "Error reading file." << endl; delete[] buffer; sqlite3_close(db); return 1; } file.close(); // Update binary data in database sqlite3_stmt *stmt; const char *sql = "UPDATE my_table SET my_blob_column = ? WHERE id = 1;"; rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); if (rc != SQLITE_OK) { cerr << "Error preparing statement: " << sqlite3_errmsg(db) << endl; delete[] buffer; sqlite3_close(db); return 1; } sqlite3_bind_blob(stmt, 1, buffer, size, SQLITE_TRANSIENT); rc = sqlite3_step(stmt); if (rc != SQLITE_DONE) { cerr << "Error updating data: " << sqlite3_errmsg(db) << endl; delete[] buffer; sqlite3_finalize(stmt); sqlite3_close(db); return 1; } // Cleanup delete[] buffer; sqlite3_finalize(stmt); sqlite3_close(db); return 0; } ``` 在这个示例中,我们首先打开了一个名为"my_database.db"的SQLite3数据库。然后,我们从一个名为"my_binary_data.bin"的文件中读取二进制数据,并将其存储在一个名为"buffer"的字符数组中。接下来,我们准备了一个SQL语句,使用"sqlite3_prepare_v2"函数编译该语句,并使用"sqlite3_bind_blob"函数绑定二进制数据到该语句中。最后,我们使用"sqlite3_step"函数执行该语句并更新数据库中的二进制数据。最后,我们清理并关闭数据库。 请注意,在这个示例中,我们使用了一个名为"SQLITE_TRANSIENT"的特殊标记来告诉SQLite3,我们正在使用动态分配的内存来存储二进制数据。这意味着SQLite3将复制这些数据,而不是仅仅在内部保存指向该数据的指针。这可以确保在更新期间,我们的内存不会被释放或修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值