SQLite中如何用api操作BLOB类型的字段

摘要:
在实际的编程开发当中我们经常要处理一些大容量二进制数据的存储,如图片或者音乐等等。对于这些二进制数据我们不能像处理普通的文本那样简单的插入或者查询,为此SQLite提供了一组函数来处理这种BLOB字段类型。下面的代码演示了如何使用这些API函数。首先创建一个数据库,然后创建一个数据表:nsqSt=sqlite3_exec;insertParaWithValue演示了插入blob数据dbHandle是调用这个函数就可以获得sqlite3_open_v2;intinsertParaWithValue{constchar*pTmp="INSERTINTOPARAMETERSVALUES('%s',%d,%d,?=SQLITE_DONE){gotoERR;}nRet=SQLITE_OK;sqlite3_finalize;returnnRet;ERR:ifsqlite3_finalize;ifDMFree;returnnRet;}updateParaRecordWithValue演示了更新BLOB数据staticintupdateParaRecordWithValue{constchar*pTmp="UPDATEPARAMETERSSETVT=%d,LENGTH=%d,VALUE=?

在实际的编程开发当中我们经常要处理一些大容量二进制数据的存储,如图片或者音乐等等。对于这些二进制数据(blob字段)我们不能像处理普通的文本那样简单的插入或者查询,为此SQLite提供了一组函数来处理这种BLOB字段类型。下面的代码演示了如何使用这些API函数。

首先创建一个数据库,然后创建一个数据表:

nsqSt = sqlite3_exec( handle, "CREATE TABLE IF NOT EXISTS PARAMETERS ( FULLNAME TEXT PRIMARY KEY, VT INTEGER, LENGTH INTEGER, VALUE BLOB, USEFUNC INTEGER )", NULL, NULL, NULL);

insertParaWithValue演示了插入blob数据

dbHandle是调用这个函数就可以获得 sqlite3_open_v2( DM_DB_FILENAME, &dbHandle,SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL );

int insertParaWithValue(DBHANDLE dbHandle, const char* pszParaName, int type, const void* pData, int cbData  )
{
    const char* pTmp = "INSERT INTO PARAMETERS( FULLNAME, VT, LENGTH, VALUE, USEFUNC) VALUES('%s', %d, %d, ?, 0)";
    size_t nTmp = strlen( pTmp );
    char* pSql = DMMalloc( nTmp+strlen(pszParaName)+11+11+1);  /*32bit decimal int max length is 11*/
    if(pSql==NULL)
        return ERROR;
    sprintf( pSql, pTmp,pszParaName, type,cbData);
    sqlite3_stmt* pstmt=NULL;
    int nRet=sqlite3_prepare_v2(dbHandle, pSql, -1, &pstmt,  NULL );
    if(nRet!=SQLITE_OK)
    {
        goto ERR;
    }
    DMFree(pSql);
    pSql=NULL;
    nRet=sqlite3_bind_blob(pstmt,1,pData,cbData, NULL );
    if(nRet!=SQLITE_OK)
    {
        goto ERR;
    }
    nRet = sqlite3_step(pstmt);
    if(nRet!=SQLITE_DONE)
    {
        goto ERR;
    }
    nRet = SQLITE_OK;
    sqlite3_finalize(pstmt );
    return nRet;
ERR:
    if(pstmt)
        sqlite3_finalize(pstmt );
    if(pSql)
        DMFree(pSql);
    return nRet;
}
updateParaRecordWithValue演示了更新BLOB数据
static int updateParaRecordWithValue(DBHANDLE dbHandle, const char* pszParaName, int type, const void* pData, int cbData  )
{
    const char* pTmp = "UPDATE PARAMETERS SET VT=%d, LENGTH=%d, VALUE=?, USEFUNC=0 WHERE FULLNAME='%s'";
    size_t nTmp = strlen( pTmp );
    char* pSql = DMMalloc( nTmp+strlen(pszParaName)+11+11+1);  /*32bit decimal int max length is 11*/
    if(pSql==NULL)
        return ERROR;
    sprintf( pSql, pTmp,type,cbData, pszParaName);
    sqlite3_stmt* pstmt=NULL;
    int nRet=sqlite3_prepare_v2(dbHandle, pSql, -1, &pstmt,  NULL );
    if(nRet!=SQLITE_OK)
    {
        goto ERR;
    }
    DMFree(pSql);
    pSql=NULL;
    nRet=sqlite3_bind_blob(pstmt,1,pData,cbData, NULL );
    if(nRet!=SQLITE_OK)
    {
        goto ERR;
    }
    nRet = sqlite3_step(pstmt);
    if(nRet!=SQLITE_DONE)
    {
        goto ERR;
    }
    nRet = SQLITE_OK;
    sqlite3_finalize(pstmt );
    return nRet;
ERR:
    if(pstmt)
        sqlite3_finalize(pstmt );
    if(pSql)
        DMFree(pSql);
    return nRet;
}

更多信息请阅读我的个人博客:blog.wenshan.me

免责声明:文章转载自《SQLite中如何用api操作BLOB类型的字段》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vscode开发vue项目使用eslint+prettier格式化:保存时自动执行lint进行修复(升级篇,保存时可格式化模板和css)ASP.NET Global.asax详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

fetch 基本使用(使用fetch、axios来替代ajax)

一、fetch fetch是一种XMLHttpRequest的一种替代方案,在工作当中除了用ajax获取后台数据外我们还可以使用fetch、axios来替代ajax 二、安装 执行npm install whatwg-fetch --save即可安装。 为了兼容老版本浏览器,还需要安装npm install es6-promise --save 三、fet...

JAVA 实现CLOB转String

CLOB 定义   数据库中的一种保存文件所使用的类型。   Character Large Object   SQL 类型 CLOB 在 JavaTM 编程语言中的映射关系。SQL CLOB 是内置类型,它将字符大对象 (Character Large Object) 存储为数据库表某一行中的一个列值。默认情况下,驱动程序使用 SQL locator(C...

Oracle中的BLOB和CLOB【转载】

原文地址:http://jelly.iteye.com/blog/65796 一、区别和定义       LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多一个LONG列   LONG RAW: 可变长二进制数据,最长2G  CLOB:  字符大对象Clob 用来存储单字节的字符数据   NCLOB:...

fmdb使用

[iOS]数据库第三方框架FMDB详细讲解 字数1706 阅读2976 评论17 喜欢110 [iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦。于是,就出现了一系列将SQLite API进行封装的库,例如FMDB、PlausibleDatab...

SQLite安装 以及 SQLite header and source version mismatch错误解决 (In debian)

小项目 需要sqlite3数据库支持 官网下载 http://www.sqlite.org/download.html 解压,进入目录执行 ./configure make make install 运行后出错 哈哈麻烦让人成长 关键词搜索到了 http://blog.csdn.net/gebitan505/article/details/19982...

如何在PHP5中通过PDO连接SQLite3数据库

  通过PHP跟PDO配置SQLite数据库是一件很繁琐的事情,经过一下午的研究,终于理清了里面的思路。现在拿出来跟大家共享。初学,错误请指出。 首先我们先选择要使用的web server 软件,由于从兼容性跟性能方面的需求,我选择了目前来说最新版的apache。 第二步,我们要使用目前最新版本的PHP zip package .这里提示大家一下,经过我痛...