本文做演示用的代码,创建了student表格,仅有两列,分别为id,thumbnail,其中id为主键。

创建数据库,打开数据库,创建表格就不多说了,直接从blob字段开始解释。

第一步,update一下blob,将其内容全部值为零。

char sql[125] = "UPDATE student SET thumbnail= :1 WHERE id = :2";
sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
sqlite3_bind_zeroblob(stmt, 1, length);
sqlite3_bind_int(stmt, 2, id);

第二步,将文件中的内容读取到blob中。

先调用sqlite3_blob_open()这个函数,

然后分段将文件内容写入,调用sqlite3_blob_write()这个函数。

最后关闭blob,调用sqlite3_blob_close().

第三步, 将blob中的内容读取到文件中。

同样,先打开blob,在读取数据库中的blob,调用sqlite3_blob_read(),写入文件,关闭blob。

源代码

#include "sqlite3.h"
#pragma comment(lib,"sqlite3.lib")
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
int  createDB(sqlite3 * db)
{
sqlite3_stmt * stmt = NULL;
char sql[125] = "CREATE TABLE IF NOT EXISTS student(id INTEGER PRIMARY KEY,thumbnail BLOB)";
int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (rc != SQLITE_OK)
{
printf("failed to prepare: %s \n", sqlite3_errmsg(db));
return -1;
}
sqlite3_step(stmt);
sqlite3_finalize(stmt);
return 0;

}

void insert (int id,sqlite3 *db)
{
sqlite3_stmt * stmt = NULL;
char sql[125] = "INSERT INTO student VALUES(:1)";
sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
sqlite3_bind_zeroblob(stmt, 1, id);
sqlite3_step(stmt);
sqlite3_finalize(stmt);
}
int my_FileLength(const char* filename)
{
FILE* fp = NULL;
fopen_s(&fp,filename, "rb");
fseek(fp, 0, SEEK_END);
int length = ftell(fp);
fclose(fp);
return length;
}

void update(sqlite3* db,int id)
{
int length = my_FileLength("example.jpg");
sqlite3_stmt * stmt = NULL;
char sql[125] = "UPDATE student SET thumbnail= :1 WHERE id = :2";
sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);

sqlite3_bind_zeroblob(stmt, 1, length);
sqlite3_bind_int(stmt, 2, id);
sqlite3_step(stmt);
sqlite3_finalize(stmt);
}

int my_PutBlob(sqlite3* db,
const char* which_db,  // "main"
const char* which_table,
const char* which_column,
int rowid,
const char* filename)
{
sqlite3_blob* blob = NULL;
int rc;

// 以READ/WRITE(1)方式打开BLOB
rc = sqlite3_blob_open(db, which_db, which_table, which_column, rowid, 1, &blob);
if (rc != SQLITE_OK)
{
printf("Failed to open BLOB: %s \n", sqlite3_errmsg(db));
return -1;
}

// 打开文件
FILE* fp = NULL;
fopen_s(&fp, filename, "rb");
if (!fp)
{
printf("failed to open file: %s \n", filename);
return -1;
}

// 分段写入
char buf[256];
int offset = 0;
while (!feof(fp))
{
int n = fread(buf, 1, 256, fp);
if (n < 0) break;
if (n == 0) continue;

sqlite3_blob_write(blob, buf, n, offset);
offset += n;
}

// 关闭
fclose(fp);
sqlite3_blob_close(blob);
return 0;
}

int my_GetBlob(sqlite3* db,
const char* which_db,  // "main"
const char* which_table,
const char* which_column,
int rowid,
const char* filename)
{
sqlite3_blob* blob = NULL;
int rc;

// 以READONLY(0)方式打开BLOB
rc = sqlite3_blob_open(db, which_db, which_table, which_column, rowid, 0, &blob);
if (rc != SQLITE_OK)
{
printf("Failed to open BLOB: %s \n", sqlite3_errmsg(db));
return -1;
}

// 打开文件
FILE* fp = NULL;
fopen_s(&fp, filename, "wb");
if (!fp)
{
printf("failed to open file: %s \n", filename);
return -1;
}

// 取得BLOB数据长度
int blob_length = sqlite3_blob_bytes(blob);

// 分段读取
char buf[256];
int offset = 0;
while (offset < blob_length)
{
int size = blob_length - offset;
if (size > 256) size = 256;

rc = sqlite3_blob_read(blob, buf, size, offset);
if (rc != SQLITE_OK)
{
printf("failed to read BLOB!\n");
break;
}

fwrite(buf, 1, size, fp);
offset += size;
}
printf("blob length: %d, read %d bytes .\n",
blob_length, offset);

// 关闭
fclose(fp);
sqlite3_blob_close(blob);
return 0;

return 0;
}

int main()
{

sqlite3 * db = NULL;
int rc = sqlite3_open("example.db", &db);
if (rc != 0)
{
printf("创建数据库失败");

}

if (1)
{
createDB(db);
insert(1, db);
update(db, 1);
my_PutBlob(db, "main", "student", "thumbnail", 1, "example.jpg");
}

if (1)
{
my_GetBlob(db, "main", "student", "thumbnail", 1, "get.jpg");
}

sqlite3_close(db);
system("pause");
return 0;
}

sqlite3中,blob字段的读取和写入相关推荐

  1. oracle Blob保存方式,关于文件保存到Oracle中BLOB字段的方法及例子

    关于文件保存到Oracle中BLOB字段的方法及例子 ------------------------------------------- public class FileOpClass { pu ...

  2. sqlite java blob_【转】好东西!sqlite3中BLOB数据类型存储大对象运用示例

    1:常用接口 个人比较喜欢sqlite, 使用最方便,唯一的准备工作是下载250K的源:而且作者很热心,有问必答. 以下演示一下使用sqlite的步骤,先创建一个数据库,然后查询其中的内容.2个重要结 ...

  3. 使用java语言操作,如何来实现MySQL中Blob字段的存取

    /** * Title: BlobPros.java * Project: test * Description: 把图片存入mysql中的blob字段,并取出 * Call Module: mtoo ...

  4. C++中txt文件的读取和写入

    C++中Txt文件读取和写入 一.ASCII 输出 为了使用下面的方法, 你必须包含头文件<fstream.h>(译者注:在标准C++中,已经使用<fstream>取代< ...

  5. qt中关于xml的读取、写入、修改等操作

    通过项目的开发,我发现xml的读写主要是分为以下几种类型: 一种类型是: <?xml version="1.0" encoding="UTF-8"?> ...

  6. “System.AccessViolationException”类型的未经处理的异常在 OpenCvSharp.dll 中发生 其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏

    问题描述: 1.程序半小时前还好好的,但是,电脑突然蓝屏重启后,再打开我的程序运行时,就出现标题所写的问题: 2.网上搜索了各种方法,好像和我的问题都没关系: 解决方法: 运行前,重新生成一下,竟然好 ...

  7. 怎么查询表中BLOB字段的大小

    返回的是字节(B) select DBMS_LOB.GETLENGTH(name) from table;

  8. 上传图片至服务器,写入到数据库Blob字段中,以及从数据库读取Blob信息(iframe父子页面传值)(1)

    最近做了个用户维护功能,涉及到照片的操作. 照片是存到数据库oracle中的Blob字段中. 难点有两个: 1,图片的上传:2,Blob字段的读取. 先说图片的上传吧, 我使用common-fileu ...

  9. 在VC6中使用ADO读取Oracle中的BLOB字段

    今天尝试将存储于Oracle(版本:9.0.1.1.1)中BLOB字段里的图像文件读出来,文件量很小,不到10K.使用vc6+ADO,使用控制台程序初步尝试如下: ::CoInitialize(NUL ...

最新文章

  1. (1)java虚拟机概念和结构图
  2. RabbitMQ简介及其安装
  3. (转载)配置apue.h
  4. ABAP ALV 颜色设置(行,列,单元格)
  5. Swift之深入解析如何自定义操作符
  6. eoiioe linux下解压命令大全
  7. error C1853: “Debug\BigBuffer.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)...
  8. VC跨进程数据(结构体)传递-WM_COPYDATA
  9. BERT重计算:用22.5%的训练时间节省5倍的显存开销(附代码)
  10. 三星 NAND 存储器新厂施工顺遂,上半年有望如期投产
  11. array,集合(collection),集合(list)的区别
  12. 数据库物理结构设计-建索引原则
  13. kafka安装包下载慢,国内镜像下载地址
  14. LaTex的图文安装--TexLife+SumtraPDF+Vscode
  15. 头文件<ctype.h>
  16. 工作那些事(十)谈谈技术主管(总监)
  17. 利用matlab实现pid控制,利用Matlab实现PID控制仿真
  18. 基于微信小程序的高校课堂教学管理系统#毕业设计
  19. 40个常见的HTML5 面试问题及答案
  20. python实现工具exe自动化

热门文章

  1. 一影碎念,一场风花,浅吟低唱成悲曲:伤感日志
  2. python echo(msg) 字符串_python的subprocess模块
  3. 美团校招实习生面试一面
  4. 小米嵌入式研发工程师校招面试总结
  5. learn opengl 笔记 1.2
  6. 三阶齐次线性方程求通解_三阶常系数线性微分方程特解的简单求法
  7. C语言经典例题-两个分数相加
  8. 微信小程序开发(六)——服务器
  9. python控制台打印文字logo
  10. 免费数据库及常用统计网址-数学建模(二十)