воскресенье, 23 июля 2023 г.

Читаем SQLITE

 Итак, мы читаем SQLITE при помощи 

rc = sqlite3_step(select_stmt);

if(SQLITE_ROW == rc) {

// Это означает, что в select_stmt есть для вас данные и вы их можете прочитать

 

cold = sqlite3_column_count(select_stmt);

for(col=0; col<cold; col++) {

printf("\tColumn %s(%i): '%s'\n",

sqlite3_column_name(select_stmt, col), col,

sqlite3_column_text(select_stmt, col));

}

}

// Теперь вы должны еще раз дернуть

rc = sqlite3_step(select_stmt);

и если rc == SQLITE_DONE, то все нормально и вы можете после

sqlite3_reset(select_stmt);

переходить к чтению следующей записи. 

 

КОДЫ 

(100) SQLITE_ROW

Код результата SQLITE_ROW, возвращаемый sqlite3_step(), указывает, что доступна другая строка вывода.

(101) SQLITE_DONE

Код результата SQLITE_DONE указывает на завершение операции. Код результата SQLITE_DONE чаще всего рассматривается как возвращаемое значение из sqlite3_step(), указывающее, что оператор SQL выполнен до конца. Но SQLITE_DONE также может быть возвращен другими многошаговыми интерфейсами, такими как sqlite3_backup_step().

пятница, 21 июля 2023 г.

Trigger в SQLITE иногда полезен

 При использовании SQLITE я заметил, что если я создаю уникальный ключ по полю с датой, то при вставке записей с одинаковой датой, база спокойно вводит неограниченное число записей. 

Этот факт я отнес к использованию даты как текст вида "YYYY-MM-DD HH:MM:SS". Для себя я решил эту задачу следующим способом:

Я создал триггер в базе данных скриптом

 DROP TRIGGER trg_validate_products_before_insert;

CREATE TRIGGER trg_validate_products_before_insert BEFORE INSERT
ON [statM]
BEGIN
SELECT
CASE
WHEN (SELECT count(*) FROM [statM] WHERE [doc_datec] like NEW.[doc_datec])>0 THEN
RAISE(ABORT, 'Duble Date')
END;
END;

В квадратных скобках моя таблица и поле. При вводе двойной даты срабатывает исключение (ABORT) и ввод не выполняется.

При вводе я готовлю предложение и выполняю его 

rc = sqlite3_step(insert_stmt);
if(SQLITE_DONE != rc) {
       fprintf(stdout, "insert statement didn't return DONE (%i): %s\n", rc, sqlite3_errmsg(db));
} else {
        printf("INSERT completed\n\n");
}
rc = sqlite3_reset(insert_stmt); 

Если вы выполняете запись в цикле, не забудьте выполнить reset. 

X-Plane 11, 12 - любитель, Фото любитель со стажем

Постоянные читатели

Архив блога