加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

MFC下调用sqlite数据库

发布时间:2020-12-12 19:34:32 所属栏目:百科 来源:网络整理
导读:好久没写博客了,下面把今天的总结下: 自己测试过,在VC6.0 VS05和VS08都可以 首先搭建环境: 一、需要的文件 sqlite3.dll SQLITE3.lib sqlite3.h C++封装库,如果纯C去做就不需要这个了 CppSQLite3U.cpp CppSQLite3U.h 然后在VS2005 下项目-属性-连接器-输
好久没写博客了,下面把今天的总结下:
自己测试过,在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.cppCppSQLite3U.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. q.nextRow();
  12. }
  13. q.finalize();
  14. 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, &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, SEEK_END);
  23. filesize = ftell(fp);
  24. fseek(fp, 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;", 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, SEEK_END);
  58. fwrite(buffer, 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. 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读