gpt4 book ai didi

c - 如何从 sqlite3_exec() 获取 COUNT(*) 值?

转载 作者:行者123 更新时间:2023-11-30 14:54:46 24 4
gpt4 key购买 nike

在我的 C 程序中,我必须检查数据库中表的计数是一还是零,为此我正在执行查询,如下所示:

char *sql = "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name=family;";
int table_count = sqlite3_exec(db, sql, 0, 0, &err_msg);
printf("\n%d\n", table_count);

我期望 table_count 为 1,因为只有一个名称为 family 的表存在,但 printf 将 table_count 输出为“21”,这是不正确的。我们如何才能在 C 程序中以正确的方式从 C/C++ API 获取 COUNT(*) 值?

最佳答案

阅读 SQLite 文档并遵循问题评论中的其他隐式/显式建议后,我意识到问题中引用的代码片段中的错误。

错误1:我没有实现回调函数来接收 SQL 查询执行后的结果集。 [已实现此回调:请参阅下面代码中的 checkTable_Callback]

错误2:“21”的输出实际上是错误代码,根据 SQLite 文档,错误代码对应于 SQLite_MISUSE也许是因为我正在使用一个单独的函数来打开我的测试数据库文件和该打开的数据库的实例,所以正在生成它,我假设,留在该 openDb 函数中,并且当我使用另一个函数< em>checkTableCount 从我在问题中引用那个困惑的代码片段开始,数据库实例可能为空,因此为 21。如果这就是我收到错误代码 21 的原因,专家可以进一步详细说明。无论如何,现在我已经修复了该函数并使 openDb 返回一个打开的数据库实例(更好的词?),现在 21 错误消失了。 [参见下面的代码]

这是固定的“针对我的情况进行了调整”的代码

    #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sqlite3.h" /* sqlite3.dll and sqlite3.h both reside in
my <program_source.c>'s folder */
static int checkTable_Callback(
void *unnecessary_here,
int number_of_columns_in_result_row, /* will always be 1 in this case */
char **value_of_count, /* will be either 0 or 1 in this case */
char **label_for_count) { /* will be COUNT(*) normally,
but modified via 'AS table_tablename' in this case*/
printf("COUNT(*) %s\t=>\t%s\n", label_for_count[0], value_of_count[0] );
return 0;
} // end of checkTable_Callback()

char * build_sql(const char *sql_partA, const char *sql_partB) {
size_t size = strlen(sql_partA) + strlen(sql_partB);
char *sql_final = malloc(size + 1);
strcpy(sql_final, sql_partA);
strcat(sql_final, sql_partB);
return sql_final; /* allocated memory to be freed at the end of calling function */
} // end of build_sql()

checkTableCount(sqlite3 *db, char *tablename) {
char *sql = build_sql(
build_sql(
build_sql(
build_sql(
"SELECT COUNT(*) AS table_",
tablename),
" FROM sqlite_master WHERE type='table' AND name='"),
tablename),
"';");
sqlite3_exec(db, sql, checkTable_Callback, 0, NULL);
/* error checking sacrificed for brevity of sample */
free(sql);
}// end of checkTableCount()

sqlite3 * openDb(char * db_name){
sqlite3 *db;
int result_code = sqlite3_open(db_name, &db);
if( result_code != 0 )
fprintf(stderr, "\tError: %s\n\n", sqlite3_errmsg(db));
return db;
} // end of openDb()

int main() {
sqlite3 * db = openDb("testing.db"); /* testing.db already has one table 'family'*/
checkTableCount(db, "family");
checkTableCount(db, "fam"); /* no such table exist */
sqlite3_close(db);
return 0;
} // end of main()

现在,这个引用的“adapted-for-my-case”代码正确地输出了 COUNT(*),如下所示:

输出

 COUNT(*) table_family   =>      1
COUNT(*) table_fam => 0

请注意,我没有费心在名为 checkTable_Callback 的回调函数中编写 for 循环来迭代列,如回调函数的官方示例 on this page 所示。因为我们预期的结果行肯定只是包含仅一列,并且标签通过“AS”子句修改为“table_tablename”。如果不通过“AS 子句”修改,则结果行中返回的列标签将为“COUNT(*)”。

关于c - 如何从 sqlite3_exec() 获取 COUNT(*) 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46511610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com