本文主要演示sqlite开源项目中的数据库方法类blob数据类型操作使用说明(包括blob数据类型的读操作和写操作等)。本项目旨在分享知识和经验,欢迎广大网友一起加入到开源项目中一起分享贡献知识和经验。
本篇旨在分享接口类的使用,内部原理请参考文章sqlite3数据库之blob数据类型读写
好了,上测试代码:
/******************************************************************************
> File Name : samples_write_blob.cpp
> Author : Wseldom
> Mail : 3235459847@qq.com
> Created Time : Thu 30 Nov 2023 10:13:59 PM CST
******************************************************************************/
#include "./samples_write_blob.hpp"
#include "sqlite/sqlite.h"
int samples_write_blob (int argc, char** argv)
{
char buff1[] = {1,2,3,4,5,6};
char buff2[] = {7,8,9,10,11,12,13,14};
class sql::blob* pblob;
if (argc < 2) {
printf ("请输入一个参数以指定数据库文件名!\n");
return -1;
}
sql::sqlite db(argv[1]);
db.exec ("create table if not exists employee("
"ID INTEGER PRIMARY KEY AUTOINCREMENT, "
"NAME TEXT NOT NULL UNIQUE, "
"AGE INT NOT NULL, "
"ADDRESS CHAR(50), "
"SALARY REAL,"
"image1 BLOB,"
"image2 BLOB"
");");
pblob = new sql::blob(false);
pblob->add (1, sizeof(buff1), buff1);
pblob->add (2, sizeof(buff2), buff2);
db.write_blob ("insert into employee(ID,NAME,AGE,ADDRESS,SALARY,image1,image2)values(NULL,'张三',29,'广州',16000,?,?);", pblob);
delete pblob;
buff1[2] = 10;
buff1[3] = 9;
buff2[0] = 0;
buff2[5] = 3;
pblob = new sql::blob(true);
pblob->copy (1, sizeof(buff1), buff1);
pblob->copy (2, sizeof(buff2), buff2);
db.write_blob ("insert into employee(ID,NAME,AGE,ADDRESS,SALARY,image1,image2)values(NULL,'李四',20,'佛山',10000,?,?);", pblob);
delete pblob;
return 0;
}
需要注意的是写操作使用的列索引是从1开始的,并非从0开始,这个地方容易出错!
编译以上代码,执行写入成功,接下来编写读blob数据测试代码以验证写入是否成功。
代码如下:
/******************************************************************************
> File Name : samples_read_blob.cpp
> Author : Wseldom
> Mail : 3235459847@qq.com
> Created Time : Thu 30 Nov 2023 10:09:43 PM CST
******************************************************************************/
#include "./samples_read_blob.hpp"
#include "sqlite/sqlite.h"
int samples_read_blob (int argc, char** argv)
{
class sql::blob* pblob;
if (argc < 2) {
printf ("请输入一个参数以指定数据库文件名!\n");
return -1;
}
sql::sqlite db(argv[1]);
pblob = new sql::blob(true);
pblob->add (0, 0, NULL);
pblob->add (1, 0, NULL);
pblob = db.read_blob ("select image1,image2 from employee where NAME='张三'", pblob);
if (pblob) {
int i;
sqlite_blob_data_t data;
unsigned char* buff;
data = pblob->data (0);
printf ("姓名:张三\n");
printf ("列号:%d, 长度:%d\n", data.column, data.len);
buff = (unsigned char*)data.pdata;
for (i = 0; i < data.len; i++) {
printf ("%d,", buff[i]);
}
printf ("\n");
data = pblob->data (1);
buff = (unsigned char*)data.pdata;
printf ("列号:%d, 长度:%d\n", data.column, data.len);
for (i = 0; i < data.len; i++) {
printf ("%d,", buff[i]);
}
printf ("\n");
delete pblob;
} else {
printf ("查询失败!\n");
}
pblob = new sql::blob(true);
pblob->add (0, 0, NULL);
pblob->add (1, 0, NULL);
pblob = db.read_blob ("select image1,image2 from employee where NAME='李四'", pblob);
if (pblob) {
int i;
unsigned char* buff;
sqlite_blob_data_t data;
data = pblob->data (0);
printf ("李四\n");
printf ("列号:%d, 长度:%d\n", data.column, data.len);
buff = (unsigned char*)data.pdata;
for (i = 0; i < data.len; i++) {
printf ("%d,", buff[i]);
}
printf ("\n");
data = pblob->data (1);
buff = (unsigned char*)data.pdata;
printf ("列号:%d, 长度:%d\n", data.column, data.len);
for (i = 0; i < data.len; i++) {
printf ("%d,", buff[i]);
}
printf ("\n");
delete pblob;
} else {
printf ("查询失败!\n");
}
return 0;
}
运行结果如下:
实验成功!