数据库学习之blob类型的数据操作

目录

blob类型简介

BLOB操作相关API介绍

编程示例

 运行结果


由于近期做Linux的项目涉及到字节流的数据库存储和读取的sqlite3与C语言的相关函数API,自己就做了这个相关的总结,至于一些基本的sqlite3的API我的这篇博客会有介绍,大家有不明白的可以参考一下。

链接:https://blog.csdn.net/qq_44045338/article/details/105500637

  • blob类型简介

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

  • BLOB操作相关API介绍

  1. 准备SQL语句

    int sqlite3_prepare(
      sqlite3 *db,            /* Database handle */
      const char *zSql,       /* SQL statement, UTF-8 encoded */
      int nByte,              /* Maximum length of zSql in bytes. */
      sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
      const char **pzTail     /* OUT: Pointer to unused portion of zSql */
    );
    

    参数介绍: 

     sqlite3 *db                       数据库操作句柄,由sqlite3_open()函数可以得到;
    const char *zSql              QL语句可以使用snprintf函数打印到某个具体的sql_buf以供自己使用;
    int nByte                           sql语句的长度;
    sqlite3_stmt **ppstmt     编译好的准备语句指针,该指针可以由sqlite3_step()执行;如果函数发生错误,该指针为NULL;
    const char **pzTail          当生成的指定语句超过nByte指定的长度时,剩余的语句存放位置。建议zSql和nByte设置足够长,这样该参数就可以直接置为NULL;
    返回值                              函数执行成功时,返回SQLITE_OK;否则返回错误码。

  2.  BLOB绑定函数

     
    int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));

    参数介绍:
    sqlite3_stmt*            准备语句指针,该指针有sqlite3_prepare()函数得到
    int                               要绑定的BLOB下标,从1开始
    const void*                 BLOB数据的指针
    int n                             BLOB数据长度
    void()(void)                析构回调函数,一般默认为空
    返回值                        函数执行成功时,返回SQLITE_OK;否则返回错误码

  3. 准备语句执行函数

    int sqlite3_step(sqlite3_stmt*);
    

    参数介绍
    sqlite3_stmt*         准备语句指针,该指针有sqlite3_prepare()函数得到
    返回值                    函数执行成功时,返回SQLITE_OK;否则返回错误码

  4.  销毁准备语句函数

    int sqlite3_finalize(sqlite3_stmt *pstmt);
    

    参数介绍
    sqlite3_stmt*            准备语句指针,该指针有sqlite3_prepare()函数得到
    返回值                       函数执行成功时,返回SQLITE_OK;否则返回错误码

  5. 获取指定字段的整形数据值

    int sqlite3_column_int(sqlite3_stmt*, int iCol);

    参数介绍
    sqlite3_stmt*        准备语句指针,该指针有sqlite3_prepare()函数得到
    int iCol                   列的编号,从0开始
    返回值                   函数执行成功时,返回SQLITE_OK;否则返回错误码

  6.  获取指定字段的BLOB值

    const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);

    参数介绍
    sqlite3_stmt*                准备语句指针,该指针有sqlite3_prepare()函数得到
    int iCol                          列的编号,从0开始
    返回值const void *      BLOB数据指针

  7. 获取指定BLOB数据长度

    int sqlite3_column_bytes(sqlite3_stmt*, int iCol);

    参数介绍
    sqlite3_stmt*         准备语句指针,该指针有sqlite3_prepare()函数得到
    int iCol                    BLOB下标,从1开始
    返回值  int              BLOB数据长度

  • 编程示例

注   测试平台:Ubuntu 14.04

        测试语言 :    C语言

#include <stdio.h>
#include <string.h>
#include "sqlite3.h"
#include "main.h"

int main (int argc, char *argv[])
{

    sqlite3 *db;
    char             sql_insert[64] = {0};
    char buf[64]= {0xfd,0x02,0x06,0x50,0xcb,0xdc,0xfd};

    db = sqlite_create(db);
    dump_buf(buf, 7);

    memset(sql_insert, 0, 64);
    snprintf(sql_insert, 64, "insert into temp values(12,?);");
    sqlite3_stmt  *stmt = NULL;
    puts("before insert dum data is :");
    dump_buf(buf, 7);
    sqlite3_prepare(db, sql_insert, strlen(sql_insert),&stmt,0);
    {
        sqlite3_bind_blob(stmt, 1, &buf, 7,NULL);
        sqlite3_step(stmt);
    }
    sqlite3_finalize(stmt);
    char sql[128] = {};
    snprintf(sql, 128, "select tlv_data from temp where id = 12");
    if (sqlite3_exec(db, sql, callback, NULL, NULL)!= SQLITE_OK)
    {
        printf("Read data from table error:%s\n", sqlite3_errmsg(db));
        return -1;
    }
    else
    {
        printf("Query  data from table success.\n");
    }
    return 0;
}
int callback(void* para, int f_num, char ** f_value,char** f_name)
{

    puts("read data from db :");
    dump_buf(*f_value, 7);
    return 0;
}
void dump_buf(char *data, int len)
{
    int  i = 0;
    for (i = 0; i< len; i++)
    {
        printf("0x%02x ", (unsigned char)data[i]);
    }
    printf("\n");
}
  •  运行结果

猜你喜欢

转载自blog.csdn.net/qq_44045338/article/details/105923274
今日推荐