Библиотека sqlite не может обновить установленный файл базы данных - PullRequest
1 голос
/ 19 марта 2020

Я могу открывать, читать и обновлять, используя инструмент командной строки sqlite3, базу данных в файле, который был помещен установщиком, например:

C:\ProgramData\spectronix\oximeter>C:\Users\James\code\bin\sqlite3 spectrumalpha.dat
SQLite version 3.16.2 2017-01-06 16:32:41
Enter ".help" for usage hints.
sqlite> .schema
CREATE TABLE run ( run INTEGER PRIMARY KEY, timestamp, desc );
CREATE TABLE distance ( hwid, distance );
CREATE TABLE spectrum ( run, timestamp, hwid, distance, data );
CREATE TABLE waveDescription ( run, timestamp, hwid );
CREATE TABLE wave ( wave, idx, data );
sqlite> select desc from run where run is 5;
update from sqlite3 tool
sqlite> UPDATE run SET desc='update #2 from sqlite3 tool' WHERE run IS 5;
sqlite> select desc from run where run is 5;
update #2 from sqlite3 tool

Но когда я запускаю этот код

#include <iostream>
#include "sqlite3.h"

int main()
{
    sqlite3 * db;
    sqlite3_stmt *st = 0;
    int ret;
    char const * tail = 0;

    ret = sqlite3_open("C:/ProgramData/spectronix/oximeter/spectrumalpha.dat",&db);

    std::cout << "working with db in "
        << sqlite3_db_filename( db, "main" ) << "\n";

    // read initial value
    ret = sqlite3_prepare_v2(
              db,
              "SELECT desc FROM run WHERE run IS 5;"
              , -1, &st, &tail );
    if( ret != SQLITE_OK )
        throw std::runtime_error("sqlite first read");
    sqlite3_step( st );
    std:: cout << "first read is " << sqlite3_column_text(st, 0) << "\n";
    sqlite3_finalize( st );

    return 0;
}

выходные данные показывают предыдущую версию данных

working with db in C:\ProgramData\spectronix\oximeter\spectrumalpha.dat
first read is test4

другая странная вещь заключается в том, что код библиотеки отказывается обновлять данные

#include <iostream>
#include "sqlite3.h"

    int main()
    {
        sqlite3 * db;
        sqlite3_stmt *st = 0;
        int ret;
        char const * tail = 0;

        ret = sqlite3_open("C:/ProgramData/spectronix/oximeter/spectrumalpha.dat",&db);

        std::cout << "working with db in "
            << sqlite3_db_filename( db, "main" ) << "\n";

        // read initial value
        ret = sqlite3_prepare_v2(
                  db,
                  "SELECT desc FROM run WHERE run IS 5;"
                  , -1, &st, &tail );
        if( ret != SQLITE_OK )
            throw std::runtime_error("sqlite first read");
        sqlite3_step( st );
        std:: cout << "first read is " << sqlite3_column_text(st, 0) << "\n";
        sqlite3_finalize( st );

        // update value
        ret = sqlite3_prepare_v2(
                  db,
                  "UPDATE run SET desc = 'new_value' WHERE run IS 5;"
                  , -1, &st, &tail );
        if( ret != SQLITE_OK )
            throw std::runtime_error("sqlite update error");
        sqlite3_finalize( st );
        std::cout << sqlite3_changes( db ) << " rows updated\n";

        return 0;
    }

выходные данные

working with db in C:\ProgramData\spectronix\oximeter\spectrumalpha.dat
first read is test4
0 rows updated

Я попытался переместить базу данных в рабочий каталог приложения, изменив вызов для открытия базы данных на

ret = sqlite3_open("spectrumalpha.dat",&db);

, но возникают те же проблемы.

Итак, наконец, я удалил базу данных и заново создал ее заново. Проблема, какой бы она ни была, исчезла! У кого-нибудь есть идеи, что это могло бы быть - в случае повторения?

На следующий день, когда проблема вернулась, после того, как я использовал installer для записи файла базы данных.

1 Ответ

0 голосов
/ 24 марта 2020

Установщик создавал файл с правами на запись для некоторых пользователей и только для чтения для других. Типичная загвоздка для unix, но не то, с чем я привык иметь дело на windows.

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