2011-09-11 8 views
2

これらのコードを含む1つのクラスに2つのメソッドがあります。メソッドGetDefinitionOfWordでは、まずDBの名前を正しく返すGetDictionaryFilePathを呼び出していますが、dbを実行するとGetDefinitionOfWordメソッド.setDatabaseName(GetDictionaryFilePath(ID));SQLDataBase setDatabaseNameはQTで動作しません

データベース名が設定されていないため、DBを開くことができず、エラーが表示されます。これをどのように修正できますか?

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

答えて

0

あなたは二度同じ接続を使用していると、構成部品が重なっています。したがって、setDatabaseNameに電話をかけたときは、すでに開いている接続のGetDictionaryFilePath機能から呼び出しています。

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

またはあなたの最初の関数の両方addDatabaseremoveDatabaseに文字列"Definitions"の代わりにFileNameを渡すことによって、それぞれ異なる「定義」データベースの1人の接続名を使用することができます。

あなたは、2人の異なる接続名を使用する必要があります。

PS:なぜQString :: fromStdStringを使用しますか? const QString &を期待する関数に直接リテラル文字列を渡すことができます(そしてすでにaddDatabase("QSQLITE")に対して行っています)。

関連する問題