select count(*) из <table> дает неверный результат, используя функцию MySQL в C

Я пытаюсь получить нет. записей из таблицы в БД Oracle. Приложение разработано на C, и я использую mySql lib для доступа к базе данных. Как я уже говорил, я использую Oracle в слое db и функции 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

Не только для этой таблицы, но и для любой другой таблицы в моей базе данных, функция возвращает только первые три цифры в значении счетчика. Какова причина этого? И как я могу исправить эту проблему?

1 ответ

Эта функция

int64_t vmsdb_read_count(char *table, char *query)

возвращает 64-битное целое число без знака.

Эта строка формата печати

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

обеспечивает d спецификатор преобразования, который ожидает (подписанный) int, Последний (скорее всего) 32-битный.

В любом случае предоставленное значение не соответствует спецификатору преобразования, который вызывает неопределенное поведение.

Другие вопросы по тегам