- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 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/
编写以下程序后,它似乎没有将参数传递给被调用的应用程序。研究时_spawnv以及它能做什么,_execvp被认为是一个合适的替代方案。有谁在源代码中看到问题并知道需要做什么来解决它? #include
在 C++ Windows 控制台程序中使用 _execv() 函数时,我发现参数以空格分隔,每个子字符串在执行程序的参数列表中成为一个单独的参数。据推测,直到找到该程序后才会发生这种情况,因为即使程
我是一名优秀的程序员,十分优秀!