Я могу открывать, читать и обновлять, используя инструмент командной строки 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 для записи файла базы данных.