RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 604044
Accepted
Matty
Matty
Asked:2020-12-16 00:53:08 +0000 UTC2020-12-16 00:53:08 +0000 UTC 2020-12-16 00:53:08 +0000 UTC

Qt 数据库的相对路径。QSqlQuery 错误“没有这样的表。无法执行语句”

  • 772

我有一个项目要从 Visual Studio 迁移到 QtCreator。编译器相应地改变。现在是使用数据库的问题。所有这些都在工作室工作,但我不明白 QtCreator 和 MinGW 不喜欢什么。具体来说,问题归结为在处理 SQL 查询时,它没有看到表。如果您查看 SQLiteManager,那么所有表都已就位,并且执行查询并提供所需的输出。

问题在这里:

QVector<QStringList> DbManager::showNotes()
{
    if (MattyNotesDb.isOpen())
    {
        QVector<QStringList> VectorOfNotes;

        QueryConstructor SelectAll;
        SelectAll.setTableName(QStringLiteral("Notes"));
        SelectAll.setOrderByClause("NoteId", Descending);

        QSqlQuery getNotesQuery;

        if( getNotesQuery.exec(SelectAll.constructSelectQuery())) // exec возвращает false
        {
            while (getNotesQuery.next()) // соответственно тоже возвращает false
            {
                QStringList Fields;
                for (int i = 0;i < 9;i++)
                {
                    Fields.push_back(getNotesQuery.value(i).toString());
                }
                VectorOfNotes.push_back(Fields);
            }
        }
        else
        {
            QMessageBox::critical(NULL, QObject::tr("Error"), getNotesQuery.lastError().text()); // no such table. Unable to execute statement
        }

        return VectorOfNotes;
    }
    else
    {
        showIsNotOpenError();
        return QVector<QStringList>();
    }
}

数据库连接:

bool DbManager::connect(const QString & path)
{
    MattyNotesDb = QSqlDatabase::addDatabase("QSQLITE");
    MattyNotesDb.setDatabaseName(path); // path="MattyNotes.sqlite"

    if(QFile::exists(path)) // true
    {
        if (!MattyNotesDb.open()) // open=true, то есть if(false)
        {
            QMessageBox::critical(NULL, QObject::tr("Error"), MattyNotesDb.lastError().text());
            MattyNotesDb.close();

            return false;
        }

        return true;
    }
    else
    {
        return false;
    }
}

提出要求:

QString QueryConstructor::constructSelectQuery()
{
    QString ResultQuery = "";

    if (TableName != "")
    {
        ResultQuery.append("SELECT ");

        if (WhatToSelectFieldNames.isEmpty())
        {
            ResultQuery.append("*");
        }
        else
        {
            for (int i = 0;i < WhatToSelectFieldNames.length()-1;i++)
            {
                ResultQuery.append(" " + WhatToSelectFieldNames[i] + ",");
            }
            ResultQuery.append(WhatToSelectFieldNames.last());
        }
        ResultQuery.append(" FROM " + TableName + constructWhereEqualsClause() + " " + OrderByClause);
    }
    return ResultQuery; // "SELECT * FROM Notes  ORDER BY NoteId DESC; " 
}

UPD: 问题出在文件路径中。如果您手动输入完整路径,则一切正常。

一。

 QString PathToDb = QCoreApplication::applicationDirPath() + "/MattyNotes.sqlite";

该选项最终将 PathToDb 变量设置为 "C:/Users/Matty/Documents/QtCreator/build-MattyNotes-Desktop_Qt_5_7_1_MinGW_32bit-Debug/debug/MattyNo" 文件夹是正确的,但为什么被截断了?

2.

QString PathToDb = QDir::currentPath() + "/MattyNotes.sqlite";

这个选项赋值为“C:/Users/Matty/MattyNotes.sqlite” 一般来说,我想知道中间文件夹去了哪里。

3.

QString PathToDb = QFileInfo(".").absolutePath() + "/MattyNotes.sqlite";

此选项给出“C:/Users/MattyNotes.sqlite”

发生了什么?如何只指定一个相对路径,以便一切都在不同的机器上运行?

还有一个问题:为什么

if(QFile::exists(path)) // true
if (!MattyNotesDb.open()) // open=true, то есть if(false)

如果数据库实际上没有打开,这些行是否返回 true?

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    maestro
    2020-12-16T01:11:37Z2020-12-16T01:11:37Z

    尚未为查询分配数据库。试试这样:

    QSqlQuery getNotesQuery(MattyNotesDb);
    

    QSqlQuery::QSqlQuery(QSqlDatabase 数据库)

    更新。当从 Qt Creator 下启动应用程序时,更改的环境将应用于程序。当前目录不是可执行文件所在目录,而是上一级目录。要确定,请在 .pro 文件中写入:

    message($$OUT_PWD)
    

    该程序将显示完整路径。这是放置数据库文件的位置。通常,如果指定的数据库文件不存在,sqlite 驱动程序会创建一个新的数据库文件。因此,很可能是数据库已经打开,但指定的表不在其中。当通过双击文件正常启动应用程序时,使用正常环境。在这种情况下,数据库文件必须在同一文件夹中,必要的 DLL 文件(Qt5Core.dll、Qt5Sql.dll、Qt5Widgets.dll 等)也必须位于该文件夹中,并且数据库驱动程序文件必须位于sqldrivers 文件夹(qsqlite.dll 好像位于目录$$[QT_INSTALL_PLUGINS]/sqldrivers)

    如果您不希望 Qt Creator 将更改后的环境应用于程序,请单击左侧的“项目”按钮,然后在底部的“运行时”中选择“系统环境”。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5