sqlite3中,blob字段的读取和写入
本文做演示用的代码,创建了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字段的读取和写入相关推荐
- oracle Blob保存方式,关于文件保存到Oracle中BLOB字段的方法及例子
关于文件保存到Oracle中BLOB字段的方法及例子 ------------------------------------------- public class FileOpClass { pu ...
- sqlite java blob_【转】好东西!sqlite3中BLOB数据类型存储大对象运用示例
1:常用接口 个人比较喜欢sqlite, 使用最方便,唯一的准备工作是下载250K的源:而且作者很热心,有问必答. 以下演示一下使用sqlite的步骤,先创建一个数据库,然后查询其中的内容.2个重要结 ...
- 使用java语言操作,如何来实现MySQL中Blob字段的存取
/** * Title: BlobPros.java * Project: test * Description: 把图片存入mysql中的blob字段,并取出 * Call Module: mtoo ...
- C++中txt文件的读取和写入
C++中Txt文件读取和写入 一.ASCII 输出 为了使用下面的方法, 你必须包含头文件<fstream.h>(译者注:在标准C++中,已经使用<fstream>取代< ...
- qt中关于xml的读取、写入、修改等操作
通过项目的开发,我发现xml的读写主要是分为以下几种类型: 一种类型是: <?xml version="1.0" encoding="UTF-8"?> ...
- “System.AccessViolationException”类型的未经处理的异常在 OpenCvSharp.dll 中发生 其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏
问题描述: 1.程序半小时前还好好的,但是,电脑突然蓝屏重启后,再打开我的程序运行时,就出现标题所写的问题: 2.网上搜索了各种方法,好像和我的问题都没关系: 解决方法: 运行前,重新生成一下,竟然好 ...
- 怎么查询表中BLOB字段的大小
返回的是字节(B) select DBMS_LOB.GETLENGTH(name) from table;
- 上传图片至服务器,写入到数据库Blob字段中,以及从数据库读取Blob信息(iframe父子页面传值)(1)
最近做了个用户维护功能,涉及到照片的操作. 照片是存到数据库oracle中的Blob字段中. 难点有两个: 1,图片的上传:2,Blob字段的读取. 先说图片的上传吧, 我使用common-fileu ...
- 在VC6中使用ADO读取Oracle中的BLOB字段
今天尝试将存储于Oracle(版本:9.0.1.1.1)中BLOB字段里的图像文件读出来,文件量很小,不到10K.使用vc6+ADO,使用控制台程序初步尝试如下: ::CoInitialize(NUL ...
最新文章
- (1)java虚拟机概念和结构图
- RabbitMQ简介及其安装
- (转载)配置apue.h
- ABAP ALV 颜色设置(行,列,单元格)
- Swift之深入解析如何自定义操作符
- eoiioe linux下解压命令大全
- error C1853: “Debug\BigBuffer.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)...
- VC跨进程数据(结构体)传递-WM_COPYDATA
- BERT重计算:用22.5%的训练时间节省5倍的显存开销(附代码)
- 三星 NAND 存储器新厂施工顺遂,上半年有望如期投产
- array,集合(collection),集合(list)的区别
- 数据库物理结构设计-建索引原则
- kafka安装包下载慢,国内镜像下载地址
- LaTex的图文安装--TexLife+SumtraPDF+Vscode
- 头文件<ctype.h>
- 工作那些事(十)谈谈技术主管(总监)
- 利用matlab实现pid控制,利用Matlab实现PID控制仿真
- 基于微信小程序的高校课堂教学管理系统#毕业设计
- 40个常见的HTML5 面试问题及答案
- python实现工具exe自动化