Невозможно получить доступ к таблицам, созданным с помощью sqlite3, из программы с использованием API C - PullRequest
0 голосов
/ 10 марта 2010

Я создаю файл базы данных sqlite3 (назовите его db.sl3; интерактивно вызывается как $ sqlite3 db.sl3 из оболочки) из программы командной строки sqlite3, например

create table people (
        id              integer,
        firstname       varchar(20),
        lastname        varchar(20),
        phonenumber     char(10)
);   
insert into people (id, firstname, lastname, phonenumber) values
        (1, 'Fred', 'Flintstone', '5055551234');    
insert into people (id, firstname, lastname, phonenumber) values
        (2, 'Wilma', 'Flintstone', '5055551234');    
insert into people (id, firstname, lastname, phonenumber) values
        (3, 'Barny', 'Rubble', '5055554321');

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

sqlite3* db;
rc = sqlite3_open( "db.sl3", &db );

или

rc = sqlite3_open_v2( "db.sl3", &db, SQLITE_READONLY, 0 );

, за которым следует запрос, где SQL содержится в следующей строке

std::string sqlCmd = "select * from sqlite_master where type='table' order by name";

для интерфейса sqlite3_get_table wrapper, вызываемого следующим образом

rc = sqlite3_get_table( db, sqlCmd.c_str(), &result, &numRows, &numCols, &errorMsg );

Код возврата (rc) в любом случае равен 0, что означает, что с операцией не было проблем, но в таблице result нет записей таблицы. Я пробовал все виды проблем с маршрутизацией (например, использование абсолютных путей к файлу db, относительные, только в каталоге вызовов и т. Д.), Но безрезультатно. Кроме того, когда я снова открываю файл базы данных с помощью программы командной строки sqlite3, я вижу таблицы и их записи. Кроме того, если я открою, создаю и вставляю строки в таблицу в программе на Си, я могу получить к ним доступ в порядке.

Любая помощь будет принята с благодарностью. Я не правильно инициализирую вещи?

1 Ответ

1 голос
/ 10 марта 2010

По умолчанию sqlite3_open создаст базу данных, если она не существует (эквивалентно вызову sqlite3_open_v2 с флагами = S QLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE ) - и rc будет быть SQLITE_OK .

Я пробовал эту тестовую программу для базы данных, созданной с использованием sqlite3 и каждый раз (существующая база данных с таблицей людей: полный путь, относительный; существующий размер 0 db: полный путь, относительный; несуществующий db: полный путь, относительный) sqlite3_open_v2 вел себя как объявлено.

Попробуйте выполнить 'sqlite3 [full_path_to_db]', затем запустите запрос и сравните результаты с тем, что делает ваша или моя программа (снова с [full_path_to_db]), на случай, если ваши sqlite3_open тесты создали примерно 0 размером db.sl3, которые затем открываются sqlite3_open_v2 .

Надеюсь, это поможет.

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