Использование функции обратного вызова для получения значений NULL в C ++ / SQLite - PullRequest
0 голосов
/ 27 марта 2020

Я использую C ++ и SQLite для базовой c системы сообщений. У меня есть поля Datetime в моей таблице сообщений, называемые «опубликовано» для исходной даты публикации и «отредактировано» для отредактированной даты, которая равна NULL, если сообщение не было отредактировано. Я могу успешно отправлять сообщения, но у меня возникают проблемы при попытке отобразить отправленные сообщения с отредактированным значением NULL.

static int getData(const char* s)
{
    sqlite3* DB;
    int exit = sqlite3_open(s, &DB);
    string sql = "SELECT MSGID, POSTED, EDITED, CONTENT FROM MESSAGES WHERE USERID IS '123' ";
    "ORDER BY DATETIME(POSTED) DESC;";
    sqlite3_exec(DB, sql.c_str(), callback, NULL, NULL);
    sqlite3_close(DB);
    return 0;
}

static int callback(void* NotUsed, int argc, char** argv, char** azColName)
{
    for (int i = 0; i < argc; i++) {
        cout << azColName[i] << ": " << argv[i] << endl;
    }
    return 0;
}

В консоли это возвращает:

MSGID: 1
POSTED: 2020-03-27 12:14:59
EDITED: 

Затем переходит на конец программы без отображения значения содержимого.

Я устанавливаю EDITED в NULL при публикации сообщения, и я также пытался вообще не задавать значение и вводить пустую строку, но я У меня та же проблема. Если я удаляю EDITED из оператора SQL, он продолжается до конца и показывает значение CONTENT.

static int getData(const char* s)
{
    sqlite3* DB;
    int exit = sqlite3_open(s, &DB);
    string sql = "SELECT MSGID, POSTED, CONTENT FROM MESSAGES WHERE USERID IS '123' ";
    "ORDER BY DATETIME(POSTED) DESC;";
    sqlite3_exec(DB, sql.c_str(), callback, NULL, NULL);
    sqlite3_close(DB);
    return 0;
}

static int callback(void* NotUsed, int argc, char** argv, char** azColName)
{
    for (int i = 0; i < argc; i++) {
        cout << azColName[i] << ": " << argv[i] << endl;
    }
    return 0;
}

возвращает

MSGID: 1
POSTED: 2020-03-27 12:14:59
CONTENT: This is a message

, поэтому я предполагаю, что это как-то связано с как функция обратного вызова обрабатывает значение NULL, но я изо всех сил пытаюсь найти руководство о том, как отобразить значения NULL и продолжить с остальной частью For l oop.

Спасибо!

РЕДАКТИРОВАТЬ: Исходя из подсказки Пола Сандерса, я изменил функцию обратного вызова следующим образом, который показывает, как я этого хотел:

static int callbackMsg(void* NotUsed, int argc, char** argv, char** azColName)
    {
        for (int i = 0; i < argc; i++) {
            cout << azColName[i] << ": ";
            if (argv[i]) {
                cout << argv[i] << endl;
            }
            else
                cout << endl;
                continue;
        }
        cout << endl;

        return 0;
    }
MSGID: 1
POSTED: 2020-03-27 12:14:59
EDITED:
CONTENT: This is a message
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...