【问题标题】:SQLDataBase setDatabaseName doesn't work in QTSQLDataBase setDatabaseName 在 QT 中不起作用
【发布时间】:2011-09-11 10:23:27
【问题描述】:

我在一个包含这些代码的类中有两个方法,在 GetDefinitionOfWord 方法中,起初我一直调用 GetDictionaryFilePath 正确返回 DB 的名称,但在执行 db.setDatabaseName(GetDictionaryFilePath(ID)) 时在 GetDefinitionOfWord 方法中;

它没有设置数据库名称,无法打开数据库,我会得到错误,我该如何解决这个问题?

请帮帮我

    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;
        }

【问题讨论】:

    标签: c++ qt sqlite


    【解决方案1】:

    您两次使用相同的连接并且配置部分重叠。因此,当您调用 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") 完成了它)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多