Sqlite переименовать пустую таблицу - PullRequest
1 голос
/ 06 марта 2020

Я пытаюсь запустить следующую строку:

"ALTER TABLE flocksStartWeight RENAME TO flocksStartWeight_old"

Где flocksStartWeight - пустая таблица sqlite (3.15.2). Когда я запускаю это в браузере sqlite db, он переименовывается нормально, но когда я пытаюсь запустить его из своего приложения qt, происходит сбой с предупреждением .:

"ПРЕДУПРЕЖДЕНИЕ: DatabaseConnectionImplementation :: executeQuery: Failed for query" ALTER TABLE flocksStartWeight RENAME TO flocksStartWeight_old ", () ПРЕДУПРЕЖДЕНИЕ:« Нет запроса, невозможно получить строку »

соответствующий код:

вызов executeQuery

bool query2Successful = db->executeQuery("ALTER TABLE flocksStartWeight RENAME TO flocksStartWeight_old")->isValid();

method

DatabaseResultUPtr DatabaseConnectionImplementation::executeQuery(const QString& query, const QVariantList& args)
{
    QMutexLocker tsLocker(&tsLock);

    if (!db.isOpen())
    {
        hDebug(TRACING_CONTEXT_RUNTIME_WARNING) << "DatabaseConnectionImplementation::executeQuery: Failed, database " << dbName << " not open";
        return DatabaseResultUPtr(new DatabaseResult());
    }

    QSqlQuery q(db);
    q.prepare(query);
    for(int i = 0 ; i < args.size() ; i++)
        q.bindValue(i, args.value(i));
    if (!q.exec())
    {
        hDebug(TRACING_CONTEXT_RUNTIME_WARNING) << "DatabaseConnectionImplementation::executeQuery: Failed for query " << q.executedQuery() << ", " << args;
        hDebug(TRACING_CONTEXT_RUNTIME_WARNING) << q.lastError().text();
        return DatabaseResultUPtr(new DatabaseResult());
    }

    QMutexLocker scoped_lock(&queryMutex);
    ++queryCount;

    return DatabaseResultUPtr(new DatabaseResult(q, this));
}

У меня много похожих переименований, и все они работали нормально. Единственное отличие заключалось в том, что flocksStartWeight не содержал никаких данных. Поэтому я вручную добавил одну строку в таблицу и повторил попытку. На этот раз это сработало. хорошо. Как мне переименовать пустую таблицу? РЕДАКТИРОВАТЬ:

Я добавил:

if(!q.prepare(query))
{
    qDebug() << "Preparing query failed for " << query;
}

Он попадает в строку qDebug для запроса, поэтому он уже терпит неудачу в методе prepare.

РЕДАКТИРОВАТЬ: Когда я задал вопрос, я предполагал, что состояние базы данных было неправильным. Проблема не может быть воспроизведена, вопрос может быть удален.

1 Ответ

2 голосов
/ 13 марта 2020

При вызове q.exe c () последняя ошибка запроса сбрасывается. Вы должны показать последнюю ошибку перед exe c (). Поскольку вы добавили проверку для prepare (), она там, где вы должны ее показать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...