sqlLite 接口的使用 包含MFC控件CListCtrl代码示例

  SqlLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至今已经有14个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

下面利用SqlLite3 实现了简单的增、删、查、改,并将查询结果显示在MFC 的CListCtrl控件中:

  

 1 //Sqlite.h
 2 class _declspec (dllexport)Sqlite
 3 {
 4 public:
 5     Sqlite(){}
 6     ~Sqlite(){}
 7     void Open(string name);
 8     void Close();
 9     bool ExecDML(string sql);
10     int ExecScalar(string sql);
11     bool ExecQuery(string sql,vector<string> &fieldName,vector<string> &fieldValue);
12     bool CreateTable(string tableName,vector<string> &fieldName);
13     bool DeleteTable(string tableName);
14     bool InsertRow(string tableName,vector<string> &fieldName,vector<string> &fieldValue);
15     bool UpdateRow(string tableName,string key,string keyValue,vector<string> &fieldName,vector<string> &fieldValue);
16     bool DeleteRow(string tableName,string key,string keyValue);
17 private:
18     CppSQLite3DB m_db;
19 };

删表:

 1 bool Sqlite::DeleteTable(string tableName)
 2     {
 3         string sql;
 4         sql=string("drop table ")+tableName+";";
 5         //删除表table1  { "drop table table1"}
 6         if(!m_db.tableExists(tableName.data()))return true;
 7         int ret= m_db.execDML(sql.data());
 8         if(ret<0)return false;
 9         return true;
10     }

建表:

 1 bool Sqlite::CreateTable(string tableName,vector<string> &fieldName)
 2     {
 3         string sql;
 4         if(m_db.tableExists(tableName.data()))return true;
 5         sql=string("create table ")+tableName+" (";
 6         if(fieldName.size()<=0)return false;
 7         vector <string>::iterator it;
 8         for(it=fieldName.begin();it!=fieldName.end();it++)
 9         {
10             sql+=(*it+" string,");
11         }
12         sql[sql.size()-1]=‘)‘;
13         sql+=";";
14         //sql=" create table table1 (ID string,name string)"
15         int ret= m_db.execDML(sql.data());
16         if(ret<0)return false;
17         return true;
18     }

向量查询,取得表行数等 :

 1 //sql="select count(*) from table1"
 2 int Sqlite::ExecScalar(string sql)
 3     {
 4         int ret=-1;
 5         try{
 6             ret=m_db.execScalar(sql.data());
 7         }catch(string ex)    {
 8             return -1;
 9         }
10         return ret;
11     }

插入数据:

 1 //sql="insert into table1 (‘ID‘,‘name‘) values(‘001‘,‘zhang‘);"
 2     bool Sqlite::InsertRow(string tableName,vector<string> &fieldName,vector<string> &fieldValue)
 3     {
 4 //    sql.Format("insert into UserTable (‘domain‘,‘ip‘,‘port‘,‘time‘) values(‘%s‘,‘%s‘,%d,‘%s‘);",domain,ip,port,t1);
 5         string sql;
 6         sql=string("insert into ")+tableName+" (";
 7         if(fieldName.size()<=0)return false;
 8         vector <string>::iterator it;
 9         for(it=fieldName.begin();it!=fieldName.end();it++)
10         {
11             sql+=("‘"+*it+"‘,");
12         }
13         sql[sql.size()-1]=‘)‘;
14         sql+=" values(";
15
16         for(it=fieldValue.begin();it!=fieldValue.end();it++)
17         {
18             sql+=("‘"+*it+"‘,");
19         }
20         sql[sql.size()-1]=‘)‘;
21         sql+=";";
22         int ret= m_db.execDML(sql.data());
23         if(ret<0)return false;
24         return true;
25     }

更改数据:

 1 //sql="update table1 set ID = ‘004‘,name = ‘zhao1‘ where ID = ‘004‘;"
 2 bool Sqlite::UpdateRow(string tableName,string key,string keyValue,vector<string> &fieldName,vector<string> &fieldValue)
 3     {
 4         string sql;
 5         if(fieldName.size()<=0)return false;
 6         if(fieldName.size()!=fieldValue.size())return false;
 7         sql=string("update ")+tableName+" set ";
 8         vector <string>::iterator it;
 9         vector <string>::iterator it1;
10         it1=fieldValue.begin();
11         for(it=fieldName.begin();it!=fieldName.end();it++)
12         {
13             sql+=(*it+" = ‘"+*it1+"‘,");
14             it1++;
15         }
16         sql[sql.size()-1]=‘ ‘;
17         if(key.data()&&keyValue.data())
18         {
19             sql+=(string("where ")+key+" = ‘"+keyValue+"‘");
20         }
21         sql+=";";
22         int ret= m_db.execDML(sql.data());
23         if(ret<0)return false;
24         return true;
25     }

删除一行数据:

 1 //sql="delete from table1 where ID = ‘004‘;";
 2 bool Sqlite::DeleteRow(string tableName,string key,string keyValue)
 3     {
 4         string sql;
 5         sql=string("delete from ")+tableName+" ";
 6         if(key.data()&&keyValue.data())
 7         {
 8             sql+=(string("where ")+key+" = ‘"+keyValue+"‘");
 9         }
10         sql+=";";
11         int ret= m_db.execDML(sql.data());
12         if(ret<0)return false;
13         return true;
14     }

查询,后文有更详细的使用代码:

 1 //sql="select * from table1";
 2 bool Sqlite::ExecQuery(string sql,vector<string> &fieldName,vector<string> &fieldValue)
 3     {
 4         CppSQLite3Query q=m_db.execQuery(sql.data());
 5         fieldName.clear();
 6         fieldValue.clear();
 7         for(int i=0;i<q.numFields();i++)
 8         {
 9             fieldName.push_back(q.fieldName(i));
10         }
11         while(!q.eof())
12         {
13             for(int i=0;i<q.numFields();i++)
14             {
15                 fieldValue.push_back(q.fieldValue(i));
16             }
17             q.nextRow();
18         }
19         return true;
20     }

demo code,how to use:

 1 //插入了4条数据,删除一条,最后查询出所有数据
 2 void Cmy_SqlLite_tDlg::OnBnClickedBnTest()
 3 {
 4
 5     // TODO:  在此添加控件通知处理程序代码
 6     int ret = 0;
 7     Sqlite m;
 8     m.Open("test.db");
 9
10     ret = m.DeleteTable("table1");
11     TRACE("%d\n", ret);
12     vector<string> fields;
13     fields.push_back("ID");
14     fields.push_back("name");
15     ret = m.CreateTable("table1", fields);
16     TRACE("%d\n", ret);
17     ret = m.ExecScalar("select count(*) from table1");
18     TRACE("%d\n", ret);
19     vector<string> Values;
20     Values.clear();
21     Values.push_back("001");
22     Values.push_back("zhang");
23     ret = m.InsertRow("table1", fields, Values);
24     TRACE("%d\n", ret);
25     ret = m.ExecScalar("select count(*) from table1");
26     TRACE("%d\n", ret);
27     Values.clear();
28     Values.push_back("002");
29     Values.push_back("wang");
30     ret = m.InsertRow("table1", fields, Values);
31     TRACE("%d\n", ret);
32     ret = m.ExecScalar("select count(*) from table1");
33     TRACE("%d\n", ret);
34     Values.clear();
35     Values.push_back("003");
36     Values.push_back("li");
37     ret = m.InsertRow("table1", fields, Values);
38     TRACE("%d\n", ret);
39     ret = m.ExecScalar("select count(*) from table1");
40     TRACE("%d\n", ret);
41     Values.clear();
42     Values.push_back("004");
43     Values.push_back("zhao");
44     ret = m.InsertRow("table1", fields, Values);
45     TRACE("%d\n", ret);
46     ret = m.ExecScalar("select count(*) from table1");
47     TRACE("%d\n", ret);
48     Values.clear();
49     Values.push_back("004");
50     Values.push_back("zhao1");
51     ret = m.UpdateRow("table1", (char *)fields[0].data(), "004", fields, Values);
52     TRACE("%d\n", ret);
53     ret = m.DeleteRow("table1", (char *)fields[0].data(), "004");
54     TRACE("%d\n", ret);
55     ret = m.ExecScalar("select count(*) from table1");
56     TRACE("%d\n", ret);
57
58
59     vector<string> fieldName;
60     vector<string> fieldValue;
61     ret = m.ExecQuery("select * from table1", fieldName, fieldValue);
62     vector <string>::iterator it;
63     for (it = fieldValue.begin(); it != fieldValue.end(); it++)
64     {
65          MessageBox(*it);
66
67     }
68
69     m.Close();
70
71  }        

下面讨论下MFC CList控件显示查询结果:

先看看效果图:

代码:

 1 void Cmy_SqlLite_tDlg::OnBnClickedBnselect()
 2 {
 3     // TODO:  在此添加控件通知处理程序代码
 4     //    CStringArray fieldName;CStringArray rowValue;
 5     CppSQLite3DB m_db;
 6     m_db.open("test.db");
 7
 8
 9     std::string sql = "select * from table1;";
10     CppSQLite3Query q = m_db.execQuery(sql.data());
11
12
13     //b
14 //删除所用行和列,reset CListCtrl
15     while (m_LsData.DeleteColumn(0))    //  因为你删除了第一列后,后面的列会依次向上移动。
16         m_LsData.DeleteAllItems();
17
18
19     m_LsData.ModifyStyle(0L, LVS_REPORT);
20     m_LsData.ModifyStyle(0L, LVS_SINGLESEL);
21     m_LsData.ModifyStyle(0L, LVS_SHOWSELALWAYS);
22     m_LsData.ModifyStyle(0L, LVS_NOSORTHEADER);
23     m_LsData.SetExtendedStyle(LVS_EX_GRIDLINES);
24     //e
25
26
27     for (int i = 0; i<q.numFields(); i++)
28     {
29     //    fieldName.push_back(q.fieldName(i));
30         m_LsData.InsertColumn(i, q.fieldName(i), LVCFMT_LEFT);
31         m_LsData.SetColumnWidth(i, strlen(q.fieldName(i)) + 100);
32     }
33     int nRow = 0;//数据太大分页,或做限制
34     while (!q.eof())
35     {
36         int nColumn = q.numFields();
37         m_LsData.InsertItem(nRow, "");
38         for (int i = 0; i<nColumn; i++)
39         {
40         //fieldValue()返回值好像一定是字符类型
41             m_LsData.SetItemText(nRow, i, q.fieldValue(i));
42
43         }
44         nRow++;
45         q.nextRow();
46     }
47     m_db.close();
48
49 }

下面是使用SQLite Expert Professional 3查看数据看”test.db“:(注:不免费,我下载的这个只有30天试用期)

整个工程,我分享在百度网盘,感谢支持,boyang987 ,all copyright reserved.

下载链接: Sqlite interface down load

时间: 2024-10-18 03:29:00

sqlLite 接口的使用 包含MFC控件CListCtrl代码示例的相关文章

MFC控件随对话框大小改变而改变

这也是我项目中碰到的问题,要让对话框中的控件随着对话框大小的变化进行自动调整,一般的做法是在WM_SIZE的响应函数中对所有的控件用MoveWindow()或者SetWindowPos()设置其变化比例. 但是由于需要自己计算,并且还有各种系统引起的情况,比如WIN7里有个选项"拖动时显示窗口内容",选中与不选中导致对话框内容显示完全不一样,选中时错误,不选正确,确实让人头大. 如EasySize是一个很好解决方案,用一些宏封装了内部的实现机制,使用起来方便快捷.原文地址:http:/

关于MFC控件删除出现“具有该ID的控件已存在”这样的情况的解决方案,详细,网上都没有这么详细的,我是“深受其害”,所以想将详细的方法分享出去。

网上关于MFC控件删除出现“具有该ID的控件已存在”这样的情况,在网上找了很多关于这方面的东西,但是都不是很全,也不容易弄明白.现在问我直接通过一个项目和图片的形式和大家一块分享一个这个解决方法(如有不对,请相互学习,qq1035169610): 1.创建一个MFC的项目,这里仅限于演示,就把项目名字称为“lu”吧. 2.下面就是将button控件添加到图形界面框中.结果如下: 3.只要将控件拉入到图形界面中,在Resource.h这个文件中创建宏,如下图所示: 4.那么开始改控件的名字和ID.

[MFC] 梳理一个简单的图片处理桌面软件中用到的MFC控件技巧

 前言 前些天应好友之拖,帮忙设计一个简单的图像处理的小软件.朋友把核心算法封装好了,但是是用openCV类似于console的编程环境,要我在此基础上改成MFC桌面程序.下图是做成之后的效果: 我是两年前稍微学了点MFC的知识,这两年中基本没有涉及,因为诸多相同的需求都可以用C#来搞定.这个本来也是想用C#来弄,可是我朋友用了openCV的相关函数封装了核心的“美颜算法”,我就只好重温经典了! 本文只涉及开发该小软件中与MFC控件相关的操作技巧,不提供朋友的“美颜算法”,还请各位见谅! 工程中

MFC控件编程:旋转按钮、进度条和滑块控件

旋转按钮(微调按钮) : 对应的控件类是CSpinButtonCtrl 进度条:对应的控件类是CProgressCtrl 滑块:对应的控件类是CSliderCtrl 对这三个控件的操作都是同过与之相关联的控件类完成的,并且这三个控件有极大的相似性,故这里放到一起 先认识下: Spin:            Progress:             Slider: 常用函数: SetRange()/GetRange(); // 设置.获取控件表示的范围 /* 设置控件的增量(步长) */ CS

MFC 控件字体样式和颜色设置

因为默认的字体大小比较小,且有时为了美观,MFC控件的字体样式更改有时显得比较重要.这一修改并不是很直观,需要经由代码来完成,代码如下: CFont *m_pFont;//创建新的字体 m_pFont = new CFont; m_pFont->CreateFont(32, // 字体高度 0, // 字体宽度 0, // 字体倾斜角 0, // 字体倾斜角 FW_EXTRALIGHT, // 字体的粗细 FALSE, // 字体是否为斜体 FALSE, // 字体是否有下划线 0, // 字体

12.MFC控件

一.MFC控件介绍 1. 静态控件,包括图片.静态文本.分组框. 在代码中很好操作该类控件,控件的默认ID都是IDC_STATIC. 如果需要操作,必须修改控件的ID. 2. 按钮控件,包括一般按钮.复选按钮.单选按钮. 控件类都是CButton类. 如果需要在同一个对话框中有多个单选的分组,需要设置单选按钮的group属性. 3. 组合框和列表框 3.1 组合框控件 控件类是CComboBox类,可在在多个数据项中选择一项,也可以接受用户的输入. 3.2 列表框控件 控件类是CListBox类

MFC控件编程:Tab Control

Tab控件的使用 1 插入Tab控件的数据项(标签) CTabCtrl::InsertItem 2 以Tab控件为父窗口创建对话框 3 调整对话框大小 4 在Tab控件的SELCHANGE消息处理函数中,根据当前选项的索引设置对话框的显示状态. 新建一个基于对话框的工程,拖放一个Tab Control控件,Ctrl+W 为之绑定一个控件变量m_wndTabCtrl 插入两个对话框资源做为标签页面,注意设置它们的样式为:child 和 无边框 双击对话框资源为他们添加相关类,父类使用默认CDial

MFC控件自适应窗口大小类

AutoAdapt.h #pragma once class CAutoAdapt { public: CAutoAdapt(void); virtual ~CAutoAdapt(void); public: void ReSize(HWND m_hWnd); void InitSize(HWND m_hWnd); POINT old; private: }; AutoAdapt.cpp #include "stdafx.h" #include "AutoAdapt.h&qu

VS2010中如何实现自定义MFC控件

本文简要讲解在VS2010中怎样实现自定义MFC控件的知识,以下是分步骤说明. 一.自定义一个空白控件  1.先创建一个MFC工程 NEW Project-->MFC-->MFC Application-->name:  "CustomCtr"-->Application Type选择"Dialog based".  2.在窗口中添加一个自定义控件 Toolbox-->"Custom Control"-->属性