无法使用C API从程序访问使用sqlite3创建的表

时间:2010-03-09 21:49:51

标签: c++ sqlite

我从sqlite3命令行程序中生成一个sqlite3数据库文件(称之为db.sl3;从shell以$ sqlite3 db.sl3交互式调用),例如

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');

我试图在我编写的使用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命令行程序重新打开数据库文件时,我可以看到表及其条目。顺便说一句,如果我打开,创建并在C程序中将行插入表中,我可以很好地访问它们。

非常感谢任何帮助。我没有正确地初始化事物吗?

1 个答案:

答案 0 :(得分:1)

默认情况下 sqlite3_open 会创建数据库(如果它不存在(等效于调用 sqlite3_open_v2 ,其中flags = S QLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE ) - 和rc将是 SQLITE_OK

我已经针对使用sqlite3创建的数据库尝试了this测试程序(每次都使用人员表的现有数据库:完整路径,相对;现有0大小的db:完整路径,相对;不存在db:完整路径,相对) sqlite3_open_v2 表现得像宣传的那样。

尝试执行'sqlite3 [full_path_to_db]'然后运行查询并将结果与​​您的程序或我的程序进行比较(再次使用[full_path_to_db]),以防您的 sqlite3_open 测试创建了一些0大小的db.sl3然后由 sqlite3_open_v2 轻轻打开。

希望这有帮助。