我从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程序中将行插入表中,我可以很好地访问它们。
非常感谢任何帮助。我没有正确地初始化事物吗?
答案 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 轻轻打开。
希望这有帮助。