Я использую 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