數據庫學習之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");
}
  •  運行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章