设为首页 加入收藏

TOP

qt实现sqlite3的级联删除(一)
2015-11-21 01:31:26 来源: 作者: 【 】 浏览:2
Tags:实现 sqlite3 删除

1.需求

有两张表,条码表和产品详情表,条码表中的rfid为产品表中的rfid外键,要求删除产品表中的相关条目时能实现条码表的级联删除

2.解决

使用qt中的sqlite3自带的级联删除解决这个需求

3.代码

mymain.cpp
#include "mysql.h"
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          bool createdb(); 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("create table tb_barcode(id INTEGER PRIMARY KEY AUTOINCREMENT, " "barcode varchar(100) not null, rfid varchar(33) not null, " "FOREIGN KEY(rfid) REFERENCES tb_goods(rfid) ON DELETE cascade)"); 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.h
#ifndef MYSQL_H #define MYSQL_H #include 
    
      #include 
     
       #include "ui_mysql.h" class mysql : public QMainWindow { Q_OBJECT public: 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_H 
     
    
mysql.cpp
#include "mysql.h" #include 
     
       #include 
      
        #include 
       
         mysql::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)); s
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇关于控制文件转储后的trace文件中.. 下一篇03-SQLite3之insert、select、whe..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: