zoukankan      html  css  js  c++  java
  • sqlite 二进制字段 (zz)

    有时我们用数据库存储文件,需要用到二进制字段,下面列常用方法。


       1.写二进制数据

         sqlite3 * db;

         int result;

         char **errmsg =NULL;

         result = sqlite3_open("test.db", &db );

        if( result != SQLITE_OK )

    { return -1;}

    result = sqlite3_exec( db,"create table tb( ID integer, content  blob)", NULL, NULL, errmsg);

    if(result != SQLITE_OK){printf("erro");}

           char *buffer;//要写的二进内容,也可以从文件读出来

           buffer=new char[1024*1024];

           for(int i=0;i<1024*1024;i++)buffer[i]='a';

    sqlite3_stmt  *stat;//写二进制数据时要用的结构

           sqlite3_prepare( db, "insert into tb( ID,  content) values( 10, ? )", -1, &stat, 0 );//准备插入数据

           sqlite3_bind_blob( stat, 1, buffer, strlen(buffer), NULL ); //把内容和字段绑定

           result=sqlite3_step( stat );//执行

           sqlite3_finalize( stat );释放内存

    sqlite3_close( db );

    2.读二进制数据

     这里重点介绍一下sqlite3_blob_open函数

    这个函数用于打开二进制字段数据

    第一个参数是数据库句柄

    第二个参数是数据库名

    第三个参数是表名

    第四个参数是二进制数据字段(列)名

    第五个参数是行数,也就是打开第几行的字段。

    第六个

    第七个参数是二进制文件句柄

    用这个函数打二进制字段就像打开文件一样简单。

    下面为例子代码:

    sqlite3 * db;

         int result;

         char **errmsg =NULL;

         result = sqlite3_open("test.db", &db );

        if( result != SQLITE_OK )

    { return -1;}

    int rf= sqlite3_blob_open(db,NULL,"Tbl_2","file_content",1,1,&sqlite3_blob);

    if(rf!= SQLITE_OK)return –1;

           int len=sqlite3_blob_bytes(sqlite3_blob);//得到二进数据长度

    sqlite3_blob_read(sqlite3_blob,buffer,len,0); 读二进数据,最后一个参数为起始位置

    //如果不想读全部内容,可以设置这个参数

           sqlite3_blob_close(sqlite3_blob);//关闭

    sqlite3_close( db );

       3.几个问题

    a.       sqlite3_blob_open函数第五个参数读第几行的数据,不知道通过什么函数能得到当前行的绝对行数,而sqlite3_total_changes函数只能得更改行的相对行数。

    b.       sqlite3_blob_write函数是用于写二进制数据,但这个函数只能用于修改二进制数据,不能用于插入二进制数据,而写数据的时候长度不能超过第一次插入数据时的长度。

      我希望存储的单个二进数据字段可能有几个G的容量,而且随时有可能修改,长度会不断变化,用sqlite3_stmt显然是不行的,而 sqlite3_blob_write函数又不能改变二进数据字段的长度,是我对Sqlite了解的不多,还是这个数据库本身就有这个限制 ,希望高手能够指点。

  • 相关阅读:
    Asp.net MVC 3实例学习之ExtShop(三)——完成首页
    Asp.net MVC 3实例学习之ExtShop(一)————创建应用并设置开发环境
    JDK里的设计模式
    Linux系统下ssh的相关配置
    简单介绍asp模式与saas模式
    Linux系统中xorg.conf文件简介
    [C++] MurmurHash2的性能
    [C++] 在程序里调用DOS命令
    Android SDK 1.5中文版 (Application基础—1)
    linux系统单网卡绑定双IP的方法
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/3723859.html
Copyright © 2011-2022 走看看