qt实现sqlite3的级联删除

1.需求有两张表,条码表和产品详情表,条码表中的rfid为产品表中的rfid外键,要求删除产品表中的相关条目时能实现条码表的级联删除2.解决使用qt中的sqlite3自带的级联删除解决这个需求3.代码mymain.cppcreatedb();int main(int argc, char *argv[]){QApplication a(argc, argv);createdb();mysql w;w.show();return a.exec();}bool createdb(){bool bret = false;//这里创建一个db目录存储数据库文件QString strdbpath(“”);strdbpath = QCoreApplication::applicationDirPath();strdbpath += “/db”;QDir dir(“”);dir.mkpath(strdbpath);strdbpath += “/mysqlite.db”;QSqlDatabase dbset = QSqlDatabase::addDatabase(“QSQLITE”, “file”);dbset.setDatabaseName(strdbpath);if (!dbset.open()) {//LOG_ALL_ERROR(QStringLiteral(“failed open mysqlite.db”));return bret;}QSqlQuery setquery(QSqlDatabase::database(“file”, true));if(!setquery.exec(“PRAGMA foreign_keys = ON;”)){QSqlError sqlerror = setquery.lastError();QString texterr = sqlerror.text();QMessageBox::information(nullptr, “errormsg”, texterr);return false;}//商品详情表bret = setquery.exec(“create table tb_goods(rfid varchar(33) primary key, name varchar(200) not null)”);if (!bret){QSqlError sqlerror = setquery.lastError();QString texterr = sqlerror.text();if (texterr.contains(“already exists”, Qt::CaseInsensitive))bret = true;else{//LOG_ALL_ERROR(QStringLiteral(“failed create table tb_goods.”));return bret;}}//这里条码对照表和skuid对照表因为可能牵涉到多对多的情况 故没有作为主键//条码对照表bret = setquery.exec();if (!bret){QSqlError sqlerror = setquery.lastError();QString texterr = sqlerror.text();if (texterr.contains(“already exists”, Qt::CaseInsensitive))bret = true;else{return bret;}}return bret;}mysql.hclass mysql : public QMainWindow{Q_OBJECTpublic:mysql(QWidget *parent = 0);~mysql();private slots:void on_insertButton_clicked();void on_deleteButton_clicked();void on_updateButton_clicked();private:void reflushModel();void setAttibutes(QTableView* pView, int nHeaderHeight = 45, int nColumnHeight = 45);private:Ui::mysqlClass ui;QSqlQueryModel m_goodsmodel;QSqlQueryModel m_barcodemodel;};#endif // MYSQL_Hmysql.cpp::mysql(QWidget *parent): QMainWindow(parent){ui.setupUi(this);m_goodsmodel.setQuery(“select * from tb_goods”, QSqlDatabase::database(“file”, true));m_goodsmodel.setHeaderData(0, Qt::Horizontal, QStringLiteral(“id”));m_goodsmodel.setHeaderData(1, Qt::Horizontal, QStringLiteral(“名称”));m_barcodemodel.setQuery(“select * from tb_barcode”, QSqlDatabase::database(“file”, true));m_barcodemodel.setHeaderData(0, Qt::Horizontal, QStringLiteral(“id”));m_barcodemodel.setHeaderData(1, Qt::Horizontal, QStringLiteral(“扫描码”));m_barcodemodel.setHeaderData(2, Qt::Horizontal, QStringLiteral(“rfid”));ui.goodView->setModel(&m_goodsmodel);ui.skuidView->setModel(&m_barcodemodel);setAttibutes(ui.goodView);setAttibutes(ui.skuidView);}mysql::~mysql(){}void mysql::on_insertButton_clicked(){QSqlQuery setquery(QSqlDatabase::database(“file”, true));setquery.exec(“insert into tb_goods values(‘123456789’, ‘aaa’)”);setquery.exec(“insert into tb_goods values(‘23456789’, ‘aaeffdda’)”);setquery.exec(“insert into tb_barcode(barcode,rfid) values(‘adddaeee’, ‘123456789’)”);reflushModel();}//这里应该问题不是很大void mysql::on_deleteButton_clicked(){QSqlQuery setquery(QSqlDatabase::database(“file”, true));setquery.exec(“delete from tb_goods where rfid=’123456789′”);reflushModel();}void mysql::on_updateButton_clicked(){QSqlQuery setquery(QSqlDatabase::database(“file”, true));setquery.exec(“update tb_goods set where rfid=’123456789′”);reflushModel();}void mysql::reflushModel(){m_goodsmodel.setQuery(“select * from tb_goods”, QSqlDatabase::database(“file”, true));m_barcodemodel.setQuery(“select * from tb_barcode”, QSqlDatabase::database(“file”, true));}void mysql::setAttibutes(QTableView* pView, int nHeaderHeight, int nColumnHeight){if ( pView == NULL ){QString strTemp = QStringLiteral(“pView== NULL!设置表格属性失败!”);return;}pView->horizontalHeader()->setFixedHeight(nHeaderHeight);//设置表头的高度pView->horizontalHeader()->setSectionsClickable(false);//设置表头不可点击(默认点击后进行排序)pView->horizontalHeader()->setStretchLastSection(true);//最后一列占满剩余空白pView->setSelectionBehavior(QAbstractItemView::SelectRows);//设置选择行为时每次选择一行pView->setEditTriggers(QAbstractItemView::NoEditTriggers);//使表视图只读pView->verticalHeader()->setDefaultSectionSize(nColumnHeight);//设置行高pView->setAlternatingRowColors(true);//可以交替颜色显示pView->setShowGrid(false);//设置不显示格子线pView->setCornerButtonEnabled(false);//左上角的按钮不可用,,此按钮功能,一点击,全选pView->horizontalScrollBar()->setStyleSheet();pView->verticalScrollBar()->setStyleSheet();}4.备注1.完整的代码下载2.还存在的问题使用自带的自增作为主键可能会出现越界的问题,不过integer最大为9223372036854775807如果数据量不是很大的话可以不必考虑3.在vs2010+qt 5.40 + win7下编译通过4.参考

有希望在的地方,痛苦也成欢乐

qt实现sqlite3的级联删除

相关文章:

你感兴趣的文章:

标签云: