select count(*)from< table>在c中使用mysql函数时给出错误的结果

wko9yo5t  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(311)

我正在尝试从oracledb中的表中获取条目数。这个应用程序是用c语言开发的,我使用mysql lib访问数据库。如前所述,我在数据库层使用oracle,在应用程序中使用mysql函数,这是使用libmysqlora完成的。除了一件事之外,所有的东西都工作得很好,当我发出“select count(*)from”这样的查询时,我只得到实际计数的前3位数字。下面是我的全部代码:

int64_t vmsdb_read_count(char *table, char *query)
{
uint i;
MYSQL_ROW row;
boolean free_query = FALSE;

if (query == NULL) {
    newvallocate(char, query, SHORT_QUERY_SIZE);
    snprintf(query, SHORT_QUERY_SIZE, "select count(*) from %s", table);
    free_query = TRUE;
}

if (mysql_query(mysql, query)) {
    exiterr(Q_NOTICE, query);
    goto ERROR;
}

if (!(res = mysql_store_result(mysql))) {
    exiterr(Q_NOTICE, "MySQL failed to store results. ");
    goto ERROR;
}

while((row = mysql_fetch_row(res))) {
    for (i=0 ; i < mysql_num_fields(res); i++) {
        int64_t count = atoll(row[i]);
        mysql_free_result(res);
        res =  NULL;
        if (free_query) {
            vfree(query);
            free_query = FALSE;
        }
        return (count);
    }
}
mysql_free_result(res);
res = NULL;
ERROR:
if (free_query) {
    vfree(query);
}
return 0;
}

对于“destination”表,当我在sqlplus中计算行数时:

SQL> select count(*) from destination;

 17928

但是当我使用前面提到的函数时:

printf("No. of rows in destination table = %d\n", vmsdb_read_count("destination", NULL));

  output--> No. of rows in destination table = 179

不仅对于这个表,而且对于数据库中的其他每一个表,该函数只返回计数值的前三位数字。原因是什么?我如何解决这个问题?

piztneat

piztneat1#

此函数

int64_t vmsdb_read_count(char *table, char *query)

返回64位无符号整数。
此打印格式字符串

printf("No. of rows in destination table = %d\n", ...

提供 d 转换说明符,它需要一个(有符号的) int . 后者(很可能)是32位。
在任何情况下,提供的值都与转换说明符不匹配,这将调用未定义的行为。

相关问题