SQLite3 插入BLOB类型的数据(C++实现)

【BLOB是什么】

BLOB (binary large object)即二进制大对象,是一种可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。常见的BLOB文件有图片、声音和自定义对象等。

 

示例代码:

#include "stdafx.h"
#include <Windows.h>
#include <string>
#include <fstream>
#include <iostream>
#include "cppsqlite3u.h"
using namespace std;


/**
 * @brief 使用cppsqlite3u封装的方法
 */
void insert_bold_demo(wstring szFile)
{
	std::fstream fs;
	fs.open(szFile.c_str(), std::ios::in | std::ios::binary);
	if (fs)
	{
		//计算图片文件长度
		fs.seekg(0, std::ios::end);
		int filesize = fs.tellg();
		fs.seekg(0, std::ios::beg);

		//读取内容
		char *filebuff = new char[filesize + 1];
		fs.read(filebuff, filesize);

		//打开数据库
		CppSQLite3DB db;
		db.open(L"demo.db");

		if (!db.tableExists(L"USER"))
		{
			db.execDML(L"CREATE TABLE USER (ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, szName VARCHAR(64), Image BLOB);");

			//
			CppSQLite3Statement dbment;
			wchar_t bufsql[255] = {0};
			wsprintf(bufsql, L"INSERT INTO USER VALUES (NULL, ?, ?);");
			dbment = db.compileStatement(bufsql);
			dbment.bind(1, L"Kandy");//写到szName字段
			dbment.bind(2, (unsigned char *)filebuff, filesize);
			int ret = dbment.execDML();
			dbment.finalize();
		}
		else
		{
			//
			CppSQLite3Statement dbment;
			wchar_t bufsql[255] = {0};
			wsprintf(bufsql, L"INSERT INTO USER VALUES (NULL, NULL, ?);");
			dbment = db.compileStatement(bufsql);
			dbment.bind(1, (unsigned char *)filebuff, filesize);
			int ret = dbment.execDML();
			dbment.finalize();
		}
		//
		delete filebuff;
		fs.close();
	}
}

/**
 * @brief sqlite3原始写法
 */
int insert_blob_raw(string szFile)
{
	//二进制方式打开
	ifstream file(szFile.c_str(), ios::in | ios::binary);
	if (!file)
	{
		cerr << "opening file failed.\n";
		return -1;
	}

	//获取文件长度
	file.seekg(0, ifstream::end);
	streampos size = file.tellg();
	file.seekg(0);

	//读取文件内容
	char* buffer = new char[size];
	file.read(buffer, size);

	sqlite3 *db = NULL;
	
	//打开数据库
	int rc = sqlite3_open_v2("demo.db", &db, SQLITE_OPEN_READWRITE, NULL);
	//int rc = sqlite3_open("demo.db", &db);
	if (rc != SQLITE_OK)
	{
		cerr << "db open failed: " << sqlite3_errmsg(db) << endl;
	}
	else 
	{
		sqlite3_stmt *stmt = NULL;
		//插入的sql语句,这里用?占位,代表BLOB数据
		rc = sqlite3_prepare_v2(db,	"INSERT INTO USER(ID, szName, Image) VALUES (NULL, NULL, ?)",
			-1, &stmt, NULL);

		if (rc != SQLITE_OK) 
		{
			cerr << "prepare failed: " << sqlite3_errmsg(db) << endl;
		} 
		else
		{
			// SQLITE_STATIC: 因为语句是在释放缓冲区之前完成的
			// 绑定BLOB数据(参数从1开始,不是0)
			rc = sqlite3_bind_blob(stmt, 1, buffer, size, SQLITE_STATIC);
			if (rc != SQLITE_OK)
			{
				cerr << "bind failed: " << sqlite3_errmsg(db) << endl;
			} 
			else
			{
				rc = sqlite3_step(stmt);
				if (rc != SQLITE_DONE)
					cerr << "execution failed: " << sqlite3_errmsg(db) << endl;
			}
		}
		sqlite3_finalize(stmt);
	}
	sqlite3_close(db);

	delete[] buffer;

	return 0;
}

/**
 * @brief _tmain
 */
int _tmain(int argc, _TCHAR* argv[])
{
	insert_bold_demo(L"1.jpg");

	insert_blob_raw("1.jpg");

	system("pause");

	return 0;
}

运行结果:

 

源代码(包含sqlite库)下载地址:https://download.csdn.net/download/hellokandy/11180068

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
插入blob数据,可以使用sqlite3_bind_blob函数将数据绑定到语句中,然后执行语句以将数据插入数据库中。 以下是一个示例: ```c #include <sqlite3.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char* argv[]) { sqlite3* db; sqlite3_stmt* stmt; const char* sql; int rc; // 打开数据库 rc = sqlite3_open("example.db", &db); if (rc != SQLITE_OK) { fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } // 准备插入语句,将blob数据绑定到语句中 sql = "INSERT INTO mytable (id, data) VALUES (?, ?)"; rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); if (rc != SQLITE_OK) { fprintf(stderr, "无法准备语句: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } int id = 1; const char* data = "this is some data"; int data_len = strlen(data); // 将id绑定到语句中 sqlite3_bind_int(stmt, 1, id); // 将data绑定到语句中 sqlite3_bind_blob(stmt, 2, data, data_len, SQLITE_TRANSIENT); // 执行插入语句 rc = sqlite3_step(stmt); if (rc != SQLITE_DONE) { fprintf(stderr, "无法执行语句: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } // 释放资源 sqlite3_finalize(stmt); sqlite3_close(db); return 0; } ``` 在上面的示例中,我们将一个字符串插入blob列中。要插入其他类型blob数据,只需更改数据类型即可。注意,第四个参数指定数据的长度,最后一个参数指定数据的释放方式。如果指定为SQLITE_TRANSIENT,SQLite会自动处理数据的释放。如果指定为SQLITE_STATIC,则应用程序必须负责数据的释放。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellokandy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值