SqlHelp.h
-
#ifndef SQLHELP_H
-
#define SQLHELP_H
-
-
#include <QString>
-
#include <QSqlDatabase>
-
#include <QSqlQuery>
-
#include <QVector>
-
class SqlHelp
-
{
-
public:
-
SqlHelp();
-
~SqlHelp();
-
void createConnection(QString dbFile);
-
void closeConnection();
-
void createDb(QString dbFile);
-
void deleteDb();
-
void createTable(QString tableName,QVector<QString> fdNameTypePairs);//fdNameTypePairs 字段名称,类型对列表
-
void deleteTable(QString tableName);
-
void addRecord(QString tableName,QVector<QString> fdNameValuePairs);
-
void delRecord(QString tableName,QString condition);
-
void setRecord(QString tableName,QVector<QString> fdNameValuePairs,QString condition);
-
void showTableUI(QString tableName);
-
QVector<QString> getFirstRecord(QString tableName,QVector<QString> fdNames,QString condition);
-
QVector<QString> getAllTableName();
-
void execSql(const QString sqlStr);
-
QString getLastSqlString() const;
-
QString getLastErrorText() const;
-
QString vectorToString(const QVector<QString> &list, QString split) const;
-
void testCase();
-
-
private:
-
QSqlDatabase connection;
-
QString lastSqlString;
-
QString lastErrorText;
-
-
};
-
-
#endif // SQLHELP_H
SqlHelp.cpp
-
#include "SqlHelp.h"
-
#include <QMessageBox>
-
#include "ui/MessageDialog.h"
-
#include <QSqlError>
-
#include <QSqlTableModel>
-
#include <QTableView>
-
#include "debug.h"
-
/**
-
* @brief SqlHelp::SqlHelp
-
*
-
* QT SQLite 辅助库
-
* Authour:dikui
-
* 测试方式:main.cpp 中添加两行
-
SqlHelp h;
-
h.testCase();
-
其中MessageDialog为自定义的对话框
-
debug.h仅包含了TRACE_MSG定义,用于调试打印输出,实际是封装了qDebug()而已
-
testCase();执行完后会产生一个数据库test.db ,里面包含了10条数据
-
-
*/
-
SqlHelp::SqlHelp()
-
{
-
-
}
-
-
SqlHelp::~SqlHelp()
-
{
-
closeConnection();
-
}
-
-
void SqlHelp::createConnection(QString dbFile)
-
{
-
connection = QSqlDatabase::addDatabase("QSQLITE");
-
connection.setDatabaseName(dbFile);
-
if (!connection.open()) {
-
MessageDialog msgBox;
-
msgBox.setTitle("ERROR");
-
msgBox.setMessage("Cannot open database :"+dbFile );
-
}
-
}
-
-
void SqlHelp::closeConnection()
-
{
-
if(connection.isOpen()){
-
connection.close();
-
}
-
}
-
-
void SqlHelp::createDb(QString dbFile)
-
{
-
Q_ASSERT(dbFile.isEmpty() == false);
-
connection = QSqlDatabase::addDatabase("QSQLITE");
-
connection.setDatabaseName(dbFile);
-
if (!connection.open()) {
-
MessageDialog msgBox;
-
msgBox.setTitle("ERROR");
-
msgBox.setMessage("Cannot open database :"+ dbFile);
-
}
-
}
-
-
void SqlHelp::deleteDb()
-
{
-
-
}
-
-
QVector<QString> SqlHelp::getAllTableName()
-
{
-
/*
-
SQLite数据库中一个特殊的表叫 sqlite_master,sqlite_master的结构。
-
CREATE TABLE sqlite_master (
-
type TEXT,
-
name TEXT,
-
tbl_name TEXT,
-
rootpage INTEGER,
-
sql TEXT
-
);
-
我们可以通过查询这个表来获取数据库所有的表名:
-
SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;
-
*/
-
QVector<QString> result;
-
QString sqlStr = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name";
-
QSqlQuery query(connection);
-
if(!query.exec(sqlStr)){
-
MessageDialog msgBox;
-
msgBox.setTitle("ERROR");
-
msgBox.setYesVisible(false);
-
lastSqlString = sqlStr;
-
lastErrorText = query.lastError().text();
-
msgBox.setMessage("SQL string :" + lastSqlString +"\n"+ "Error text:"+lastErrorText);
-
msgBox.exec();
-
}
-
//遍历表名
-
-
while ( query.next() ) {
-
result.append(query.value(0).toString());
-
}
-
return result;
-
-
}
-
/**
-
* @brief SqlHelp::createTable 创建表
-
* @param tableName 表名称
-
* @param fdNameTypePairs 字段名,字段值类型对。比如表字段为 id,name,类型分别为int primary key,varchar
-
* 那么 fdNameTypePairs 数组的值依次设置为"id","int primary key","name","varchar"
-
*/
-
void SqlHelp::createTable(QString tableName, QVector<QString> fdNameTypePairs)
-
{
-
-
/**
-
QVector<QString> fdDeclareList;
-
fdDeclareList<<"id"<<"int primary key";
-
fdDeclareList<<"name"<<"varchar";
-
fdDeclareList<<"color"<<"varchar";
-
fdDeclareList<<"picture"<<"varchar";
-
fdDeclareList<<"barcode"<<"int";
-
fdDeclareList<<"stage"<<"varchar";
-
h.createTable("recipe",fdDeclareList);
-
*/
-
//query1.exec("create table student (id int primary key, name varchar(20))");
-
-
//检查表是否已存在
-
QVector<QString> existTables = getAllTableName();
-
if(existTables.indexOf(tableName) >= 0){
-
return;
-
}
-
-
QString createStr = "create table " + tableName;
-
QString nameTypeStr ;
-
if( fdNameTypePairs.count() % 2 ){
-
MessageDialog msgBox;
-
msgBox.setTitle("Error");
-
msgBox.setMessage("fdNameTypePairs count error" );
-
msgBox.exec();
-
}
-
for (int i = 0; i < fdNameTypePairs.count(); i+=2) {
-
nameTypeStr += fdNameTypePairs.at(i) + " " + fdNameTypePairs.at(i+1) + ",";
-
}
-
nameTypeStr = nameTypeStr.mid(0,nameTypeStr.length() -1);//remove last ","
-
QString sqlStr = createStr + " (" + nameTypeStr +")";
-
-
execSql(sqlStr);
-
}
-
/**
-
* @brief SqlHelp::deleteTable 删除表
-
* @param tableName
-
*/
-
void SqlHelp::deleteTable(QString tableName)
-
{
-
QString sqlStr = "drop table " + tableName;
-
-
execSql( sqlStr) ;
-
-
}
-
/**
-
* @brief SqlHelp::addRecord 向表中添加一条记录
-
* @param tableName 操作的表名
-
* @param fdNameValuePairs 字段名,字段值对。比如添加项为 id=1 name="zhangshan"
-
* 那么fdNameValuePairs数组的值依次设置为"id","1","name","'zhangshan'",注意字符串类型的值要加上'
-
*/
-
void SqlHelp::addRecord(QString tableName, QVector<QString> fdNameValuePairs)
-
{
-
//INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
-
//QString("INSERT INTO %1 ( %2 ) VALUES ( %3 )").arg(tableName).arg(nameStr).arg(valueStr);
-
-
if( fdNameValuePairs.count() % 2 ){
-
MessageDialog msgBox;
-
msgBox.setTitle("Error");
-
msgBox.setMessage("fdNameValuePairs count error" );
-
msgBox.exec();
-
return;
-
}
-
QVector<QString> names;
-
QVector<QString> values;
-
for (int i = 0; i < fdNameValuePairs.count(); i+=2) {
-
names.append(fdNameValuePairs.at(i));
-
values.append(fdNameValuePairs.at(i+1));
-
}
-
-
QString nameStr;
-
QString valueStr;
-
//拼接 name
-
for (int i = 0; i < names.count(); ++i) {
-
nameStr += names.at(i) + ",";
-
}
-
nameStr = nameStr.mid(0,nameStr.length()-1);//remove last ","
-
//拼接 value
-
for (int i = 0; i < values.count(); ++i) {
-
valueStr += values.at(i) + ",";
-
}
-
valueStr = valueStr.mid(0,valueStr.length()-1);//remove last ","
-
-
//sqlStr = actionStr + " (" + nameStr +") VALUES (" + valueStr +")";
-
QString sqlStr = QString("INSERT INTO %1 ( %2 ) VALUES ( %3 )").arg(tableName).arg(nameStr).arg(valueStr);
-
-
execSql( sqlStr) ;
-
-
-
}
-
-
-
void SqlHelp::delRecord(QString tableName,QString condition)
-
{
-
//DELETE FROM 表名称 WHERE 列名称 = 值
-
QString sqlStr;
-
if(condition.isEmpty()){
-
sqlStr = QString("DELETE FROM %1").arg(tableName);
-
}else{
-
sqlStr = QString("DELETE FROM %1 WHERE %2").arg(tableName).arg(condition);
-
}
-
execSql(sqlStr);
-
-
}
-
-
void SqlHelp::setRecord(QString tableName, QVector<QString> fdNameValuePairs, QString condition)
-
{
-
//参数说明
-
//condition为空时,应用到所有列
-
//返回值
-
-
-
//更新某一行中的若干列
-
//UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'
-
//QString("UPDATE %1 SET %2 WHERE %3").arg(tableName).arg(nameValueStr).arg(condition);
-
QString nameValueStr;
-
if( fdNameValuePairs.count() % 2 ){
-
MessageDialog msgBox;
-
msgBox.setTitle("Error");
-
msgBox.setMessage("fdNameValuePairs count error" );
-
msgBox.exec();
-
return;
-
}
-
QVector<QString> names;
-
QVector<QString> values;
-
for (int i = 0; i < fdNameValuePairs.count(); i+=2) {
-
names.append(fdNameValuePairs.at(i));
-
values.append(fdNameValuePairs.at(i+1));
-
}
-
//拼接 name = value
-
for (int i = 0; i < names.count(); ++i) {
-
nameValueStr += names.at(i) + " = " + values.at(i) + ",";
-
}
-
nameValueStr = nameValueStr.mid(0,nameValueStr.length()-1);//remove last ","
-
-
QString sqlStr ;
-
if(condition.isEmpty()){
-
sqlStr = QString("UPDATE %1 SET %2 ").arg(tableName).arg(nameValueStr);
-
}else{
-
sqlStr = QString("UPDATE %1 SET %2 WHERE %3").arg(tableName).arg(nameValueStr).arg(condition);
-
}
-
execSql( sqlStr) ;
-
-
}
-
-
QVector<QString> SqlHelp::getFirstRecord(QString tableName, QVector<QString> fdNames,QString condition)
-
{
-
//condition为空时,应用到所有列
-
//SELECT LastName,FirstName FROM Persons
-
QVector<QString> fdValues;
-
QString nameStr = vectorToString(fdNames, ",");
-
QString sqlStr;
-
if(condition.isEmpty()){
-
sqlStr = QString("SELECT %1 FROM %2 ").arg(nameStr).arg(tableName);
-
}else{
-
sqlStr = QString("SELECT %1 FROM %2 WHERE %3").arg(nameStr).arg(tableName).arg(condition);
-
}
-
QSqlQuery query(connection);
-
-
if(!query.exec(sqlStr)){
-
MessageDialog msgBox;
-
msgBox.setTitle("ERROR");
-
msgBox.setYesVisible(false);
-
lastSqlString = sqlStr;
-
lastErrorText = query.lastError().text();
-
msgBox.setMessage("SQL string :" + lastSqlString +"\n"+ "Error text:"+lastErrorText);
-
msgBox.exec();
-
}
-
if( query.first() ){
-
for (int i = 0; i < fdNames.count(); ++i) {
-
fdValues.append(query.value(i).toString());
-
}
-
return fdValues;
-
}
-
return fdValues;
-
}
-
-
-
-
void SqlHelp::showTableUI(QString tableName)
-
{
-
QSqlTableModel *model = new QSqlTableModel();
-
model->setTable(tableName);
-
model->select();
-
// 设置编辑策略
-
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
-
QTableView *tableView = new QTableView();
-
tableView->setModel(model);
-
MessageDialog msgBox;
-
msgBox.setTitle(tableName);
-
msgBox.setWorkUI(tableView);
-
msgBox.exec();
-
delete tableView;
-
delete model;
-
-
}
-
-
-
-
void SqlHelp::execSql(const QString sqlStr)
-
{
-
if(!connection.isOpen()){
-
MessageDialog msgBox;
-
msgBox.setTitle("ERROR");
-
msgBox.setMessage("connection is not open");
-
msgBox.exec();
-
return;
-
}
-
QSqlQuery query(connection);
-
-
if(!query.exec(sqlStr)){
-
MessageDialog msgBox;
-
msgBox.setTitle("ERROR");
-
msgBox.setYesVisible(false);
-
lastSqlString = sqlStr;
-
lastErrorText = query.lastError().text();
-
msgBox.setMessage("SQL string :" + lastSqlString +"\n"+ "Error text:"+lastErrorText);
-
msgBox.exec();
-
}
-
-
}
-
-
QString SqlHelp::getLastSqlString() const
-
{
-
return lastSqlString;
-
}
-
-
QString SqlHelp::getLastErrorText() const
-
{
-
return lastErrorText;
-
}
-
-
QString SqlHelp::vectorToString(const QVector<QString> &list, QString split) const
-
{
-
-
QString result;//转化成val1,val2,val3
-
for (int i = 0; i < list.count(); ++i) {
-
result += list.at(i) + split;
-
}
-
int index = result.lastIndexOf(split);
-
result.remove(index,split.length());
-
return result;
-
-
}
-
-
void SqlHelp::testCase()
-
{
-
QString tableName= "recipe";
-
createDb( "test.db");
-
//h.deleteTable("recipe");
-
QVector<QString> fdDeclareList;
-
fdDeclareList<<"id"<<"INTEGER PRIMARY KEY autoincrement";
-
fdDeclareList<<"name"<<"varchar";
-
fdDeclareList<<"color"<<"varchar";
-
fdDeclareList<<"picture"<<"varchar";
-
fdDeclareList<<"barcode"<<"int";
-
fdDeclareList<<"stage"<<"varchar";
-
createTable(tableName,fdDeclareList);
-
-
for (int i = 0; i < 10; ++i) {
-
QVector<QString> fdDeclareList;
-
//fdDeclareList<<"id"<<QString::number(i);
-
fdDeclareList<<"name"<<QString("'name%1'").arg(i);
-
fdDeclareList<<"color"<<QString("'ff000%1'").arg(i);
-
fdDeclareList<<"picture"<<QString("'picture%1'").arg(i);
-
fdDeclareList<<"barcode"<<QString("20181219000000%1").arg(i);
-
fdDeclareList<<"stage"<<QString("'stage%1'").arg(i);
-
addRecord("recipe",fdDeclareList);
-
TRACE_MSG(i);
-
}
-
//h.delRecord(tableName,"1=1");
-
QVector<QString> fdNameValuePair2 ;
-
fdNameValuePair2<<"barcode"<<"1";
-
-
setRecord(tableName,fdNameValuePair2,"1=1");
-
showTableUI(tableName);
-
-
QVector<QString> fdNames ;
-
fdNames<<"id"<<"name";
-
TRACE_MSG( getFirstRecord(tableName,fdNames,""));
-
-
}
阅读(35806) | 评论(0) | 转发(0) |