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

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     //b14 //删除所用行和列,reset CListCtrl15     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     //e25 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

 

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