gpt4 book ai didi

c++ - SQLDataBase setDatabaseName 在 QT 中不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:51 25 4
gpt4 key购买 nike

我在一个包含这些代码的类中有两个方法,在方法 GetDefinitionOfWord 中,起初我调用了正确返回数据库名称的 GetDictionaryFilePath,但是在执行 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;
}

最佳答案

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

关于c++ - SQLDataBase setDatabaseName 在 QT 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7377590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com