【发布时间】:2014-06-18 08:28:53
【问题描述】:
我正在用 C 语言开发一个小型应用程序,我想使用 SQLite 对数据库执行一些查询。问题是我的行为很奇怪。
如果我在 Firefox 插件“SQLite Manager”上的同一个数据库上运行相同的查询,我会得到预期的结果,但如果我通过程序中的 C 接口运行它,我会得到结果元组的错误顺序。
你可以找到数据库here(CSV或SQLite格式),而有问题的查询是这个:
SELECT name, slot, id, species_id
FROM type_names T, pokemon_types PT, pokemon P
WHERE T.type_id = PT.type_id
AND P.id = PT.pokemon_id AND T.local_language_id = 9
AND P.identifier LIKE '%char%'
ORDER BY P.species_id;
在 Firefox 上我得到了预期的结果:
+--------+------+--------+------------+ |姓名 |插槽 |编号 |物种_id | +--------+------+--------+------------+ |火灾 | 1 | 4 | 4 | |火灾 | 1 | 5 | 5 | |火灾 | 1 | 6 | 6 | |飞行 | 2 | 6 | 6 | |火灾 | 1 | 10034 | 6 | |龙 | 2 | 10034 | 6 | |火灾 | 1 | 10035 | 6 | |飞行 | 2 | 10035 | 6 | |火灾 | 1 | 390 | 390 | +--------+------+--------+------------+在 C 中我得到这个:
+--------+------+--------+------------+ |姓名 |插槽 |编号 |物种_id | +--------+------+--------+------------+ |火灾 | 1 | 4 | 4 | |火灾 | 1 | 5 | 5 | |飞行 | 2 | 6 | 6 | |飞行 | 2 | 10035 | 6 | |火灾 | 1 | 6 | 6 | |火灾 | 1 | 10034 | 6 | |火灾 | 1 | 10035 | 6 | |龙 | 2 | 10034 | 6 | |火灾 | 1 | 390 | 390 | +--------+------+--------+------------+我还尝试了一些仅使用该查询访问数据库的简单代码,但我总是遇到同样的问题,代码如下:
#include <stdio.h>
#include <sqlite3.h>
// argument 1 is path to db, argument 2 is query
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
int i;
for(i=0; i<argc; i++){
printf("%s\t", argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(int argc, char **argv){
sqlite3 *db;
char *zErrMsg = 0;
int rc;
if( argc!=3 ){
fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
return(1);
}
rc = sqlite3_open(argv[1], &db);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return(1);
}
rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
if( rc!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
sqlite3_close(db);
return 0;
}
【问题讨论】:
-
您需要发布代码以获得足够的帮助
-
我编辑了我的问题,试图使代码尽可能简单。
-
在 SELECT 子句中包含
P.species_id时的输出是什么? -
已编辑表格,包括species_id。
-
似乎您期望:从 type_names T、pokemon_types PT、pokemon P WHERE T.type_id = PT.type_id AND P.id = PT.pokemon_id AND T 中选择名称、插槽、id、species_id。 local_language_id = 9 AND P.identifier LIKE '%char%' ORDER BY P.species_id, id, slot ASC;