您的位置:首页 > 数据库

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控件中:

  

//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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐