SQLDataBase setDatabaseName 在 QT 中不起作用

SQLDataBase setDatabaseName doesn't work in QT

本文关键字:不起作用 QT setDatabaseName SQLDataBase      更新时间:2023-10-16

我在一个包含这些代码的类中有两个方法,在方法GetDefinitionOfWord中,首先我调用了GetDictionaryFilePath正确返回DB的名称,但在方法GetDefinitionOfWord中,当执行DB . setdatabasename (GetDictionaryFilePath(ID));

它没有设置数据库名称,不能打开数据库,我会得到错误,我怎么能解决这个问题?

请帮帮我

    QString Dictionary_Operation::GetDefinitionOfWord(QString ID, QString Word)
    {
        QString Result = "";
        QString FinalResult = "";
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
        QString DBOpenErrorTitle = QString::fromStdString("Error");
        QString DBOpenErrorMessage = QString::fromStdString("Access denied.");

        QString FileName = GetDictionaryFilePath(ID);
            db.setDatabaseName(GetDictionaryFilePath(ID));
        if (QFile::exists(QString::fromStdString(".\" + FileName.toStdString()))) {
                    db.setDatabaseName(GetDictionaryFilePath(ID));
                    if (!db.open()) {
                        QMessageBox::critical(0, DBOpenErrorTitle, DBOpenErrorMessage,
                                QMessageBox::Cancel);
                    }
                    else
                    {
             QSqlQuery query;
            query.exec(QString::fromStdString("PRAGMA encoding = UTF-16"));
            QString s = QString::fromStdString("SELECT Definition FROM Dictionary_Words WHERE HeadWord = '%1'").arg(ID);
           QSqlQuery sql(s, db);
            while ( sql.next() )
            {
                  Result =  Result.append(sql.record().value(0).toString());
            }
            db.close();
                FinalResult = ReplaceImageToBase64(Result, ID);
            }
        }
        QSqlDatabase::removeDatabase(FileName);
        return FinalResult;
    }
另一种方法是:
      QString Dictionary_Operation::GetDictionaryFilePath(QString ID)
        {
            QString Result = "0";
            QSqlDatabase dbGetDictionaryFilePath =  QSqlDatabase::addDatabase("QSQLITE");
            QString DBOpenErrorTitle = QString::fromStdString("Error");
            QString DBOpenErrorMessage = QString::fromStdString("Access denied.");

            if (QFile::exists(".\1.pldb")) {
                        dbGetDictionaryFilePath.setDatabaseName(QString::fromStdString("1.pldb"));
                        if (!dbGetDictionaryFilePath.open()) {
                            QMessageBox::critical(0, DBOpenErrorTitle, DBOpenErrorMessage,
                                    QMessageBox::Cancel);
                        }
                        else
                        {
                 QSqlQuery query;
                query.exec(QString::fromStdString("PRAGMA encoding = UTF-16"));

                QString s = QString::fromStdString("SELECT FileName FROM Dictionaries WHERE ID = %1").arg(ID);
               QSqlQuery sql(s, dbGetDictionaryFilePath);
                while ( sql.next() )
                {
                      Result =  sql.record().value(0).toString();
                }
               // dbGetDictionaryFilePath.close();
                }
            }
            QSqlDatabase::removeDatabase(QString::fromStdString("1.pldb"));
            return Result;
        }

您使用了两次相同的连接,并且配置部分重叠。因此,当您调用setDatabaseName时,您是在GetDictionaryFilePath函数已经打开的连接上调用它。

你应该使用2个不同的连接名:

QString Dictionary_Operation::GetDefinitionOfWord(QString ID, QString Word)
{
    ...
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "Definitions");
    QString FileName = GetDictionaryFilePath(ID);
    db.setDatabaseName(FileName);
    ...
    // Remove with the name of the connection (and not databaseName())
    QSqlDatabase::removeDatabase("Definitions");
    ...
}
QString Dictionary_Operation::GetDictionaryFilePath(QString ID)
{
    QSqlDatabase dbGetDictionaryFilePath =  
        QSqlDatabase::addDatabase("QSQLITE", "Dictionaries");
    ...
        dbGetDictionaryFilePath.setDatabaseName("1.pldb");
    ...      
    QSqlDatabase::removeDatabase("Dictionaries"); 
}

或者你可以使用一个连接名称为每个不同的"定义"数据库通过传递FileName而不是字符串"Definitions"addDatabaseremoveDatabase在你的第一个函数。

PS:为什么你使用QString::fromStdString ?您可以直接将文字字符串传递给期望const QString &的函数(您已经为addDatabase("QSQLITE")做过了)。