sqlLite 接口的使用 包含MFC控件CListCtrl代码示例
2015-01-14 17:58
513 查看
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控件中:
删表:
建表:
向量查询,取得表行数等 :
插入数据:
更改数据:
删除一行数据:
查询,后文有更详细的使用代码:
demo code,how to use:
下面讨论下MFC CList控件显示查询结果:
先看看效果图:
代码:
下面是使用SQLite Expert Professional 3查看数据看”test.db“:(注:不免费,我下载的这个只有30天试用期)
整个工程,我分享在百度网盘,感谢支持,boyang987 ,all copyright reserved.
下载链接: Sqlite interface down load
下面利用SqlLite3 实现了简单的增、删、查、改,并将查询结果显示在MFC 的CListCtrl控件中:
//Sqlite.h class _declspec (dllexport)Sqlite { public: Sqlite(){} ~Sqlite(){} void Open(string name); void Close(); bool ExecDML(string sql); int ExecScalar(string sql); bool ExecQuery(string sql,vector<string> &fieldName,vector<string> &fieldValue); bool CreateTable(string tableName,vector<string> &fieldName); bool DeleteTable(string tableName); bool InsertRow(string tableName,vector<string> &fieldName,vector<string> &fieldValue); bool UpdateRow(string tableName,string key,string keyValue,vector<string> &fieldName,vector<string> &fieldValue); bool DeleteRow(string tableName,string key,string keyValue); private: CppSQLite3DB m_db; };
删表:
bool Sqlite::DeleteTable(string tableName) { string sql; sql=string("drop table ")+tableName+";"; //删除表table1 { "drop table table1"} if(!m_db.tableExists(tableName.data()))return true; int ret= m_db.execDML(sql.data()); if(ret<0)return false; return true; }
建表:
bool Sqlite::CreateTable(string tableName,vector<string> &fieldName) { string sql; if(m_db.tableExists(tableName.data()))return true; sql=string("create table ")+tableName+" ("; if(fieldName.size()<=0)return false; vector <string>::iterator it; for(it=fieldName.begin();it!=fieldName.end();it++) { sql+=(*it+" string,"); } sql[sql.size()-1]=')'; sql+=";"; //sql=" create table table1 (ID string,name string)" int ret= m_db.execDML(sql.data()); if(ret<0)return false; return true; }
向量查询,取得表行数等 :
//sql="select count(*) from table1" int Sqlite::ExecScalar(string sql) { int ret=-1; try{ ret=m_db.execScalar(sql.data()); }catch(string ex) { return -1; } return ret; }
插入数据:
//sql="insert into table1 ('ID','name') values('001','zhang');" bool Sqlite::InsertRow(string tableName,vector<string> &fieldName,vector<string> &fieldValue) { // sql.Format("insert into UserTable ('domain','ip','port','time') values('%s','%s',%d,'%s');",domain,ip,port,t1); string sql; sql=string("insert into ")+tableName+" ("; if(fieldName.size()<=0)return false; vector <string>::iterator it; for(it=fieldName.begin();it!=fieldName.end();it++) { sql+=("'"+*it+"',"); } sql[sql.size()-1]=')'; sql+=" values("; for(it=fieldValue.begin();it!=fieldValue.end();it++) { sql+=("'"+*it+"',"); } sql[sql.size()-1]=')'; sql+=";"; int ret= m_db.execDML(sql.data()); if(ret<0)return false; return true; }
更改数据:
//sql="update table1 set ID = '004',name = 'zhao1' where ID = '004';" bool Sqlite::UpdateRow(string tableName,string key,string keyValue,vector<string> &fieldName,vector<string> &fieldValue) { string sql; if(fieldName.size()<=0)return false; if(fieldName.size()!=fieldValue.size())return false; sql=string("update ")+tableName+" set "; vector <string>::iterator it; vector <string>::iterator it1; it1=fieldValue.begin(); for(it=fieldName.begin();it!=fieldName.end();it++) { sql+=(*it+" = '"+*it1+"',"); it1++; } sql[sql.size()-1]=' '; if(key.data()&&keyValue.data()) { sql+=(string("where ")+key+" = '"+keyValue+"'"); } sql+=";"; int ret= m_db.execDML(sql.data()); if(ret<0)return false; return true; }
删除一行数据:
//sql="delete from table1 where ID = '004';"; bool Sqlite::DeleteRow(string tableName,string key,string keyValue) { string sql; sql=string("delete from ")+tableName+" "; if(key.data()&&keyValue.data()) { sql+=(string("where ")+key+" = '"+keyValue+"'"); } sql+=";"; int ret= m_db.execDML(sql.data()); if(ret<0)return false; return true; }
查询,后文有更详细的使用代码:
//sql="select * from table1"; bool Sqlite::ExecQuery(string sql,vector<string> &fieldName,vector<string> &fieldValue) { CppSQLite3Query q=m_db.execQuery(sql.data()); fieldName.clear(); fieldValue.clear(); for(int i=0;i<q.numFields();i++) { fieldName.push_back(q.fieldName(i)); } while(!q.eof()) { for(int i=0;i<q.numFields();i++) { fieldValue.push_back(q.fieldValue(i)); } q.nextRow(); } return true; }
demo code,how to use:
//插入了4条数据,删除一条,最后查询出所有数据 void Cmy_SqlLite_tDlg::OnBnClickedBnTest() { // TODO: 在此添加控件通知处理程序代码 int ret = 0; Sqlite m; m.Open("test.db"); ret = m.DeleteTable("table1"); TRACE("%d\n", ret); vector<string> fields; fields.push_back("ID"); fields.push_back("name"); ret = m.CreateTable("table1", fields); TRACE("%d\n", ret); ret = m.ExecScalar("select count(*) from table1"); TRACE("%d\n", ret); vector<string> Values; Values.clear(); Values.push_back("001"); Values.push_back("zhang"); ret = m.InsertRow("table1", fields, Values); TRACE("%d\n", ret); ret = m.ExecScalar("select count(*) from table1"); TRACE("%d\n", ret); Values.clear(); Values.push_back("002"); Values.push_back("wang"); ret = m.InsertRow("table1", fields, Values); TRACE("%d\n", ret); ret = m.ExecScalar("select count(*) from table1"); TRACE("%d\n", ret); Values.clear(); Values.push_back("003"); Values.push_back("li"); ret = m.InsertRow("table1", fields, Values); TRACE("%d\n", ret); ret = m.ExecScalar("select count(*) from table1"); TRACE("%d\n", ret); Values.clear(); Values.push_back("004"); Values.push_back("zhao"); ret = m.InsertRow("table1", fields, Values); TRACE("%d\n", ret); ret = m.ExecScalar("select count(*) from table1"); TRACE("%d\n", ret); Values.clear(); Values.push_back("004"); Values.push_back("zhao1"); ret = m.UpdateRow("table1", (char *)fields[0].data(), "004", fields, Values); TRACE("%d\n", ret); ret = m.DeleteRow("table1", (char *)fields[0].data(), "004"); TRACE("%d\n", ret); ret = m.ExecScalar("select count(*) from table1"); TRACE("%d\n", ret); vector<string> fieldName; vector<string> fieldValue; ret = m.ExecQuery("select * from table1", fieldName, fieldValue); vector <string>::iterator it; for (it = fieldValue.begin(); it != fieldValue.end(); it++) { MessageBox(*it); } m.Close(); }
下面讨论下MFC CList控件显示查询结果:
先看看效果图:
代码:
void Cmy_SqlLite_tDlg::OnBnClickedBnselect() { // TODO: 在此添加控件通知处理程序代码 // CStringArray fieldName;CStringArray rowValue; CppSQLite3DB m_db; m_db.open("test.db"); std::string sql = "select * from table1;"; CppSQLite3Query q = m_db.execQuery(sql.data()); //b //删除所用行和列,reset CListCtrl while (m_LsData.DeleteColumn(0)) // 因为你删除了第一列后,后面的列会依次向上移动。 m_LsData.DeleteAllItems(); m_LsData.ModifyStyle(0L, LVS_REPORT); m_LsData.ModifyStyle(0L, LVS_SINGLESEL); m_LsData.ModifyStyle(0L, LVS_SHOWSELALWAYS); m_LsData.ModifyStyle(0L, LVS_NOSORTHEADER); m_LsData.SetExtendedStyle(LVS_EX_GRIDLINES); //e for (int i = 0; i<q.numFields(); i++) { // fieldName.push_back(q.fieldName(i)); m_LsData.InsertColumn(i, q.fieldName(i), LVCFMT_LEFT); m_LsData.SetColumnWidth(i, strlen(q.fieldName(i)) + 100); } int nRow = 0;//数据太大分页,或做限制 while (!q.eof()) { int nColumn = q.numFields(); m_LsData.InsertItem(nRow, ""); for (int i = 0; i<nColumn; i++) { //fieldValue()返回值好像一定是字符类型 m_LsData.SetItemText(nRow, i, q.fieldValue(i)); } nRow++; q.nextRow(); } m_db.close(); }
下面是使用SQLite Expert Professional 3查看数据看”test.db“:(注:不免费,我下载的这个只有30天试用期)
整个工程,我分享在百度网盘,感谢支持,boyang987 ,all copyright reserved.
下载链接: Sqlite interface down load
相关文章推荐
- 自定义MFC ClistCtrl控件的示例代码
- Control Study->AdRotator广告控件显示自定义配置文件中广告以及与DataGrid控件结合使用显示图片(示例代码下载)
- Asp.net 2.0 自定义控件开发专题[详细探讨页面状态(视图状态和控件状态)机制及其使用场景](示例代码下载)
- Asp.net 2.0 自定义控件开发专题[详细探讨页面状态(视图状态和控件状态)机制及其使用场景](示例代码下载)
- Asp.net 2.0 自定义控件开发专题[详细探讨页面状态(视图状态和控件状态)机制及其使用场景](示例代码下载)
- Asp.net 2.0 自定义控件开发专题[详细探讨页面状态(视图状态和控件状态)机制及其使用场景](示例代码下载)
- 演示事件(Event)怎样使用以及怎样为用户控件添加一个事件(示例代码下载)
- Asp.net 2.0 自定义控件开发专题[详细探讨页面状态(视图状态和控件状态)机制及其使用场景](示例代码下载)
- Asp.net 2.0 自定义控件开发专题[详细探讨页面状态(视图状态和控件状态)机制及其使用场景](示例代码下载)
- Asp.net 2.0 自定义控件开发专题[详细探讨页面状态(视图状态和控件状态)机制及其使用场景](示例代码下载)
- 演示事件(Event)怎样使用以及怎样为用户控件添加一个事件(示例代码下载)
- Control Study->AdRotator广告控件显示自定义配置文件中广告以及与DataGrid控件结合使用显示图片(示例代码下载)
- Asp.net 2.0 自定义控件开发专题[详细探讨页面状态(视图状态和控件状态)机制及其使用场景](示例代码下载)
- 演示事件(Event)怎样使用以及怎样为用户控件添加一个事件(示例代码下载)
- 演示事件(Event)怎样使用以及怎样为用户控件添加一个事件(示例代码下载)
- Asp.net 2.0 自定义控件开发专题[详细探讨页面状态(视图状态和控件状态)机制及其使用场景](示例代码下载)
- Asp.net 2.0 自定义控件开发专题[详细探讨页面状态(视图状态和控件状态)机制及其使用场景](示例代码下载)
- 演示事件(Event)怎样使用以及怎样为用户控件添加一个事件(示例代码下载)
- Asp.net 2.0 自定义控件开发专题[详细探讨页面状态(视图状态和控件状态)机制及其使用场景](示例代码下载)
- Asp.net 2.0 自定义控件开发专题[详细探讨页面状态(视图状态和控件状态)机制及其使用场景](示例代码下载)