qt实现sqlite3的级联删除

1.需求

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

2.解决

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

3.代码

mymain.cpp
#include "mysql.h"
#include <QtWidgets/QApplication>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QtCore/QDir>
#include <QMessageBox>

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))
     
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt实现 SQLite3 连接池需要以下步骤: 1. 创建一个 SQLite3 连接类,其中包含打开 SQLite3 数据库的函数和关闭数据库的函数。 ```c++ // sqliteconnection.h #ifndef SQLITECONNECTION_H #define SQLITECONNECTION_H #include <QString> #include <QSqlDatabase> #include <QSqlError> class SQLiteConnection { public: static bool open(QString path); static void close(); static QSqlDatabase getConnection(); private: static QSqlDatabase db; }; #endif // SQLITECONNECTION_H ``` ```c++ // sqliteconnection.cpp #include "sqliteconnection.h" QSqlDatabase SQLiteConnection::db; bool SQLiteConnection::open(QString path) { db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName(path); if (!db.open()) { qDebug() << "Error: connection with database failed"; qDebug() << db.lastError().text(); return false; } qDebug() << "Database: connection ok"; return true; } void SQLiteConnection::close() { db.close(); } QSqlDatabase SQLiteConnection::getConnection() { return db; } ``` 2. 创建一个 SQLite3 连接池类,其中包含获取连接和释放连接的函数。 ```c++ // sqlitepool.h #ifndef SQLITEPOOL_H #define SQLITEPOOL_H #include <QObject> #include <QSqlDatabase> #include <QMutex> #include <QQueue> class SQLitePool : public QObject { Q_OBJECT public: static SQLitePool& getInstance(); QSqlDatabase getConnection(); void releaseConnection(QSqlDatabase conn); private: SQLitePool(QObject* parent = nullptr); ~SQLitePool(); SQLitePool(const SQLitePool&) = delete; SQLitePool& operator=(const SQLitePool&) = delete; QMutex mutex; QQueue<QSqlDatabase> pool; }; #endif // SQLITEPOOL_H ``` ```c++ // sqlitepool.cpp #include "sqlitepool.h" #include "sqliteconnection.h" SQLitePool::SQLitePool(QObject* parent) : QObject(parent) { } SQLitePool::~SQLitePool() { QMutexLocker locker(&mutex); while (!pool.isEmpty()) { QSqlDatabase conn = pool.dequeue(); conn.close(); } QSqlDatabase::removeDatabase("qt_sql_default_connection"); } SQLitePool& SQLitePool::getInstance() { static SQLitePool instance; return instance; } QSqlDatabase SQLitePool::getConnection() { QMutexLocker locker(&mutex); if (pool.isEmpty()) { return SQLiteConnection::getConnection(); } return pool.dequeue(); } void SQLitePool::releaseConnection(QSqlDatabase conn) { QMutexLocker locker(&mutex); if (conn.isOpen()) { pool.enqueue(conn); } } ``` 3. 在应用程序中使用连接池。 ```c++ // main.cpp #include <QCoreApplication> #include <QDebug> #include <QSqlQuery> #include "sqlitepool.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); SQLitePool& pool = SQLitePool::getInstance(); if (!SQLiteConnection::open("test.db")) { return -1; } QSqlDatabase conn1 = pool.getConnection(); QSqlQuery query1(conn1); query1.exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)"); QSqlDatabase conn2 = pool.getConnection(); QSqlQuery query2(conn2); query2.exec("INSERT INTO users (name) VALUES ('Alice')"); QSqlDatabase conn3 = pool.getConnection(); QSqlQuery query3(conn3); query3.exec("SELECT * FROM users"); while (query3.next()) { qDebug() << query3.value(0).toInt() << query3.value(1).toString(); } pool.releaseConnection(conn2); QSqlDatabase conn4 = pool.getConnection(); QSqlQuery query4(conn4); query4.exec("INSERT INTO users (name) VALUES ('Bob')"); pool.releaseConnection(conn4); pool.releaseConnection(conn1); pool.releaseConnection(conn3); SQLiteConnection::close(); return a.exec(); } ``` 以上就是实现 SQLite3 连接池的基本步骤,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值