找回密码
 立即注册
收起左侧

qt如何执行sqlite的递归语句

5
回复
6828
查看
[复制链接]
累计签到:6 天
连续签到:1 天
来源: 2018-4-8 18:08:01 显示全部楼层 |阅读模式
1Qter豆
我用qt4.8连接sqlite3的数据库,有一个with recursive的递归语句要执行,但是写成QSqlQuery后,在exec执行的时候会报错:

QSqlError(1, "Unable to execute statement", "near "with": syntax error")


请问有没有办法用qt访问sqlite3数据库,去执行 with recursive 开头的查询语句呢?


我搜索了很久,大部分sqlite3数据操作的例子,都是执行的 select 这种简单的查询,我没有找到递归查询的例子。


希望大家能帮帮我,非常感谢!!!

最佳答案

查看完整内容

完整的贴出来?
回复

使用道具 举报

尚未签到

2018-4-8 18:08:02 显示全部楼层
完整的贴出来?
回复

使用道具 举报

累计签到:6 天
连续签到:1 天
2018-4-9 10:00:05 显示全部楼层

我编写的QT中执行sql语句的部分代码如下:

    QString ied_info_sql = " with recursive vl(cb, appid, pied, pp, sied, sp, cable, level) as ( ";
    ied_info_sql.append(" select v.cb, v.appid, v.pub_ied, v.pub_port, v.sub_ied, v.sub_port, v.cable, 0 ");
    ied_info_sql.append(" from s_vir_link as v ");
    ied_info_sql.append(" where v.sub_ied = '"+ sub_ied +"' and appid = '"+appid+"' union ");
    ied_info_sql.append(" select v.cb, v.appid, v.pub_ied, v.pub_port, v.sub_ied, v.sub_port, v.cable, vl.level+1 ");
    ied_info_sql.append(" from s_vir_link as v JOIN vl  ON v.sub_ied = vl.pied and v.appid = vl.appid ) ");
    ied_info_sql.append(" select cb, appid, pied, pp, sied, sp, cable, level from vl order by level desc;");
   
    qDebug()<<ied_info_sql;
    sql_query.prepare(ied_info_sql);

    if(!sql_query.exec(ied_info_sql))
    {
        qDebug()<<sql_query.lastError();
    }
    else
    {
        while(sql_query.next())
        {
            qDebug()<<sql_query.value(2).toString();
        }
    }

如果把SQL语句换成select之类的简单查询,是可以正常执行的。

我把调试过程中打印出来的sql递归查询语句复制如下:
with recursive
  vl(cb, appid, pied, pp, sied, sp, cable, level) as(
    select v.cb, v.appid, v.pub_ied, v.pub_port, v.sub_ied, v.sub_port, v.cable, 0
       from s_vir_link as v
       where v.sub_ied = 'CF2201' and appid = '1217'
     union
     select v.cb, v.appid, v.pub_ied, v.pub_port, v.sub_ied, v.sub_port, v.cable, vl.level+1
       from s_vir_link as v JOIN vl
       ON v.sub_ied = vl.pied and
          v.appid = vl.appid
  )
select * from vl order by level desc;

用sqliteSpy之类的数据库访问工具执行,是可以查出结果的,但是用QT来执行SQLQuery就会报错。

错误如下:
QSqlError(1, "Unable to execute statement", "near "with": syntax error")
回复

使用道具 举报

累计签到:6 天
连续签到:1 天
2018-4-10 21:08:37 显示全部楼层
我用的QT版本是4.8.2,看到网上有的说5.8版本的可以执行with recursive语句,我先去下载一个QT5.8版本的试试吧
回复

使用道具 举报

累计签到:6 天
连续签到:1 天
2018-4-11 10:58:13 显示全部楼层
我装了QT5.8之后还是不行,在网上找了关于with语句的例子。
如下:
可以正常运行,说明qt应该能执行递归查询语句。
#include "mainwindow.h"
#include <QApplication>

#include <QCoreApplication>

#include <QSqlDatabase>

#include <QSqlQuery>

#include <QtDebug>

#include <QSqlRecord>

#include <QSqlField>

int main(int argc, char *argv[])

{
   
    QCoreApplication a(argc, argv);
   
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "memory");
   
    db.setDatabaseName(":memory:");
   
    if ( db.open() ) {
        
        qDebug()<<"open database succeeded";
        
        QSqlQuery query(db);
        
        if ( query.exec("create table if not exists testTable( id INT PRIMARY KEY,[name] NVARCHAR(20), parentId INT );") ) {
            
            qDebug()<<"Create table succeeded";
            
            query.exec("INSERT INTO testTable(id,[name],parentId) VALUES(1,'xf1',0); ");
            
            query.exec("INSERT INTO testTable(id,[name],parentId) VALUES(2,'xf2',0); ");
            
            query.exec("INSERT INTO testTable(id,[name],parentId) VALUES(3,'xf3',2); ");
            
            query.exec("INSERT INTO testTable(id,[name],parentId) VALUES(4,'xf4',3); ");
            
            query.exec("INSERT INTO testTable(id,[name],parentId) VALUES(5,'xf5',4); ");
            
            query.exec("INSERT INTO testTable(id,[name],parentId) VALUES(6,'xf6',5); ");
            
            
            query.exec("WITH RECURSIVE\
                       cte(id,name,parentId) AS( \
                           SELECT id,name,parentId FROM testTable WHERE id='6'  \
                    UNION ALL  \
                    SELECT a.id,a.name,a.parentId FROM testTable AS a INNER JOIN   \
                           cte ON a.id=cte.parentId     \
                    )  \
                       SELECT * FROM cte order by id desc;  ");
                    
                    qDebug()<<"with clause";
            
            while(query.next()) {
               
                qDebug()<<"id="<<query.record().field("id").value().toInt()<<",name="<<query.record().field("parentId").value().toString();
               
            }
            
            query.exec("WITH RECURSIVE  \
                       cnt(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM cnt WHERE x<10)  \
                       SELECT x FROM cnt order by x; ");
                    while(query.next()) {
               
                qDebug()<<"id="<<query.record().field("x").value().toInt()<<",name="<<query.record().field("parentId").value().toString();
               
            }
            
        }
        
        else {
            
            qDebug()<<"Create table failed";
            
        }
        
    }
   
    return a.exec();
   
}

但是我的代码不行,我试着执行其他语句,比如select * from s_vir_link ,可以正常执行,说明这个表应该是没问题,可以读取的。

我猜想会不会是SQLITE数据库有什么设置,或者这个表有权限之类的,不能执行with recursive语句。
我的数据库连接语句如下,测试可以连接数据库
QString dbName = "vis_infomation.db";

    QSqlDatabase db;
    if(QSqlDatabase::contains("qt_sql_default_connection"))
        db = QSqlDatabase::database("qt_sql_default_connection");
    else
    {
        db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("./data/"+dbName);
    }

    if (!db.open()) {
        qDebug()<<" can't open database >>>>>> "<<dbName;
        exit(-1);
    }

但是执行 3楼的sql递归语句时,就会报错说with附近有语法错误。
回复

使用道具 举报

累计签到:6 天
连续签到:1 天
2018-4-11 13:08:54 显示全部楼层
已经解决,我把自己的工程改成了QT5.8下的工程,然后就能执行递归语句啦!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了