Chinaunix首页 | 论坛 | 博客
  • 博客访问: 577273
  • 博文数量: 136
  • 博客积分: 893
  • 博客等级: 中士
  • 技术积分: 1001
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-31 09:18
个人简介

生命可以终止,梦想不会!

文章分类

全部博文(136)

文章存档

2016年(4)

2015年(2)

2014年(5)

2013年(7)

2012年(118)

分类: C/C++

2014-03-11 17:54:16

好久没写博客了,下面把今天的总结下:
自己测试过,在VC6.0 VS05和VS08都可以
首先搭建环境:
一、需要的文件
sqlite3.dll
SQLITE3.lib
sqlite3.h

C++封装库,如果纯C去做就不需要这个了
CppSQLite3U.cpp
CppSQLite3U.h
然后在VS2005 下项目->属性->连接器->输入->附加依赖项里添加 SQLITE3.lib 
然后在程序中添加#include "CppSQLite3U.h"
VC6.0的话
VC6.0(默认多字节)的话如果假如C++库的话,编译会提示一个错误,貌似是转换为整型的,改下就可以了,
OK

一般的创建、查询:
(创建可以纯用C去写,我这里为了方便调用的C++的库 CppSQLite3U.cpp CppSQLite3U.h)

点击(此处)折叠或打开

  1.     CppSQLite3DB db;
  2.     CppSQLite3Query q;

  3.     m_list.ResetContent();
  4.     db.open("d:\\test.db");    
  5.     q = db.execQuery("select * from student"); //查询
  6.     CString strTemp;
  7.     while (!q.eof())
  8.     {
  9.         strTemp.Format(("%s-%s-%s"),q.fieldValue(0),q.fieldValue(1),q.fieldValue(2));
  10.         m_list.AddString(strTemp);
  11.         
  12.         q.nextRow();    
  13.     }
  14.     q.finalize();
  15.     db.close();
插入blob类型的数据时:
(稍微修改一点,应该可以跨平台使用)

点击(此处)折叠或打开

  1. sqlite3 *db;
  2.     char *zErrMsg = 0;
  3.     int ret;
  4. //    char **Result;
  5.     char *sql;
  6.     sqlite3_stmt    *stat = 0;
  7.     ret = sqlite3_open("db2.db", &db); //打开数据库,跟打开文本文件一样
  8.     sqlite3_exec(db, "CREATE TABLE list (age int UNIQUE, fliename varchar(128), fzip blob);", 0, 0, &zErrMsg);    //

  9.     for (int i = 1; i <= 2; i++)
  10.     {
  11.         CString str;
  12.         str.Format("insert into list values (%d,'mmmm.rar',?);", i);
  13.         //由于mmmm.rar是一个二进制文件,所以要在使用insert语句时先用?号代替
  14.         sqlite3_prepare(db, str, -1, &stat, 0);
  15.         FILE *fp = NULL;
  16.         long filesize = 0;
  17.         char * ffile;
  18.         fp = fopen("mmmm.rar", "rb");
  19.         if(fp != NULL)
  20.         {
  21.             //计算文件的大小
  22.             fseek(fp, 0, SEEK_END);
  23.             filesize = ftell(fp);
  24.             fseek(fp, 0, SEEK_SET);
  25.             //读取文件
  26.             ffile = new char[filesize + 1];
  27.             size_t sz = fread(ffile, sizeof(char), filesize + 1, fp);
  28.             fclose(fp);
  29.         }
  30.         //将文件数据绑定到insert语句中,替换“?”部分
  31.         sqlite3_bind_blob(stat, 1, ffile, filesize, NULL);
  32.         //执行绑定之后的SQL语句
  33.         sqlite3_step(stat);
  34. /////////////////////////////////////////////////////////////////////////
  35.         //这时数据库当中已经有了一条包含BLOB字段的数据。接下来我们要读取这条数据:
  36.         //选取该条数据
  37.         sqlite3_prepare(db, "select * from list;", -1, &stat, 0);
  38.         sqlite3_step(stat);
  39.         //得到记录中的BLOB字段

  40.         // 得到第几列的2进制数据
  41.         const void * test = sqlite3_column_blob(stat, 2);
  42.         //得到字段中数据的长度
  43.         int size = sqlite3_column_bytes(stat, 2);
  44.         char *buffer;
  45.         buffer = new char[size + 1];

  46.         //用内存拷贝 拷贝该字段
  47.         memcpy(buffer, test, size);
  48.         //拷贝该字段
  49.         //     sprintf(buffer, "%s", test);
  50.         //    buffer[size] = '\0';

  51.         //此时可以将buffer2写入到文件当中,至此BLOB数据处理完毕。

  52.         fp = fopen("111.rar", "wb");                                //此处以后应当先接受文件名。之后打开文件,接受客户端的数据写文件。
  53.         if (fp == NULL)
  54.         {
  55.             return;
  56.         }
  57.         fseek(fp, 0, SEEK_END);
  58.         fwrite(buffer, 1, size + 1, fp);
  59.         fflush(fp);
  60.         fclose(fp);
  61.         fp = NULL;

  62.         if (buffer != NULL)
  63.         {
  64.             delete []buffer;
  65.             buffer = NULL;
  66.         }
  67.     }
  68.     
  69.     sqlite3_close(db);
以上自己测试成功。。。
附图:


参考文章:
http://www.cnblogs.com/wengzilin/archive/2012/03/28/2420796.html
http://www.cnblogs.com/hnrainll/archive/2011/09/08/2170506.html
阅读(8179) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~