powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite. Как вызвать ошибку в дополнительной (собственной) функции?
5 сообщений из 5, страница 1 из 1
SQLite. Как вызвать ошибку в дополнительной (собственной) функции?
    #36207703
Фотография Алексей VN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При вызове функции sqlite3_result_error, база данных не останавливаает выполнение запроса с генерацией ошибки, а просто не выводит строку в результирующий датасет (я пробовал на одной строке, SELECT fn1(1)). А надо, так как я этими функциями сделал арифметику без потерь точности. И за подобный результат мне просто открутят голову.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
void mySqliteFunction1(sqlite3_context* c, int argc, sqlite3_value** argv) {
  sqlite3_result_error(c, "Error", - 1 ); // Нет строки, нет ошибки
}
void mySqliteFunction2(sqlite3_context* c, int argc, sqlite3_value** argv) {
  sqlite3_result_error_toobig(c); // Нет строки, нет ошибки
}
void mySqliteFunction3(sqlite3_context* c, int argc, sqlite3_value** argv) {
  sqlite3_column_int64(с,  1234 ); // Есть строка, все ок
}
void init() {
  sqlite3_create_function(dbHandle, "fn1",  1 , SQLITE_ANY,  0 , mySqliteFunction1,  0 ,  0 );
  sqlite3_create_function(dbHandle, "fn2",  1 , SQLITE_ANY,  0 , mySqliteFunction2,  0 ,  0 );
  sqlite3_create_function(dbHandle, "fn3",  1 , SQLITE_ANY,  0 , mySqliteFunction3,  0 ,  0 );
  // Пробовал SQLITE_UTF8

  sqlite3_prepare(...)

  while(sqlite3_step(...)== 0  || == 100 ) {
    switch(sqlite3_column_type(...)) {
      case SQLITE_INTEGER: ... sqlite3_column_int(...); ... break;
      case SQLITE_FLOAT: ... sqlite3_column_double(...); ... break;
      case SQLITE3_TEXT: ... sqlite3_column_text(...); ... break;
      case SQLITE_NULL: ... break;
  }
}
...
Рейтинг: 0 / 0
SQLite. Как вызвать ошибку в дополнительной (собственной) функции?
    #36208017
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
В чем смотрите? В шелле sqlite3 ваша функция должна выдавать ошибку. Вероятно, вы просто теряете сообщение об ошибке.
...
Рейтинг: 0 / 0
SQLite. Как вызвать ошибку в дополнительной (собственной) функции?
    #36208040
Фотография Алексей VN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибку я получаю с помощью sqlite3_errmsg , если sqlite3_prepare()!=SQLITE_OK . И если в синтаксисе запроса допустить ошибку, то ошибка выводится.

Вы меня натолкнули на мысль, что возможно ошибку надо проверять после каждого вызова sqlite3_step . Вечером проверю.
...
Рейтинг: 0 / 0
SQLite. Как вызвать ошибку в дополнительной (собственной) функции?
    #36208638
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Алексей VNОшибку я получаю с помощью sqlite3_errmsg , если sqlite3_prepare()!=SQLITE_OK . И если в синтаксисе запроса допустить ошибку, то ошибка выводится.

Вы меня натолкнули на мысль, что возможно ошибку надо проверять после каждого вызова sqlite3_step . Вечером проверю.

sqlite3_prepare не выполняет запрос, а только подготавливает его. Разумеется, эта функция не может определить ошибки этапа выполнения запроса :-)
...
Рейтинг: 0 / 0
SQLite. Как вызвать ошибку в дополнительной (собственной) функции?
    #36210723
Фотография Алексей VN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался.

Sqlite3_step возвращает значения 100 (Есть строка) и 101 (Конец данных). Если происходит ошибка, то возвращаемое значение 1.

Но это только для первого выполнения!

После вызова sqlite3_reset, sqlite3_step возвращает 0 (Есть строка), 1 (Нет строки), но и для ошибки тоже 1. И соответственно невозможно понять, это конец данных или ошибка, так как sqlite3_errno - возвращает значение аналогичное sqlite3_step, а sqlite3_error возвращает "Unknown error" даже если нет ошибки.

В общем, самым простым и надежным решением было не использовать sqlite3_reset, а повторно вызывать sqlite3_prepare. Тогда с возвращаемыми значениями ошибок нет.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite. Как вызвать ошибку в дополнительной (собственной) функции?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]