从sqlite3中读取二进制数据

#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>

int main( void )
{
       sqlite3 *db=NULL;//声明sqlite关键结构指针
       char *zErrMsg = 0;
       int rc,id;

       //打开或创建一个数据库文件
       rc = sqlite3_open("bind.db", &db);     //打开指定的数据库文件,如果不存在,将创
//建一个同名的数据库文件,需要传入db这个指针的指针,因为sqlite3_open函数要为这,个指
//针分配内存,好要让db指针指向这个内存区
       if(rc!=SQLITE_OK){//或者直接是rc
               fprintf(stderr,"Can't open database: %s\n",sqlite3_errmsg(db));
               sqlite3_close(db);
               exit(1);//打开失败,退出
       }
       else printf("You have opened a sqlite3 database named bind.db successfully!\nCongratulation! Have fun!\n");
     
     //读取二进制数据
     sqlite3_stmt * stat;//sqlite 操作二进制数据需要用这个辅助的数据类型:sqlite3_stmt *
     sqlite3_prepare( db, "select * from Tb1_2", -1, &stat, 0 );//把 sql语句"select * from Tb1_2"解析到stat结构里去,返回值是SQLITE_OK表示成功
     sqlite3_step(stat);//查询数据,返回值是SQLITE_ROW时表示成功,可以循环执行 sqlite3_step 函数,一次 step 查询出一条记录。直到返回值不为 SQLITE_ROW 时表示查询结束
     id = sqlite3_column_int(stat,0);
       printf("id=%d\n",id);//获得字段的id值,第2个参数表示获取第几个字段内容,从0开始计算,因为我的表的ID字段是第一个字段,因此这里我填0
       const void * pFileContent = sqlite3_column_blob(stat, 1 );//file_content 的值,因为 file_content 是二进制,因此我需要得到它的指针,还有它的长度
       printf("file_content=:%s\n",pFileContent);
       int len = sqlite3_column_bytes(stat, 1 );
       printf("len=%d\n",len);

       sqlite3_finalize(stat);//把 pFileContent 的内容保存出来之后,把刚才分配的内容析构掉
       sqlite3_close(db);//关闭数据库
       return 0;
}

编译和运行可执行文件:
root@cky-desktop:/home/src# gcc -o bind -l sqlite3 bind.c
root@cky-desktop:/home/src# sudo ./bind
You have opened a sqlite3 database named bind.db successfully!
Congratulation! Have fun!
id=10
file_content=:010101010101010110101010 1010101
len=31
要在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、付费专栏及课程。

余额充值