Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

13 Декабрь 2017, 23:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Код ошибки базы данных, подключенной через ODBC-драйвер  (Прочитано 418 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ost
Пользователь
**
Offline Offline

Сообщений: 73


« Стартовое сообщение: 17 Апрель 2017, 11:35 »

Доброго.

Есть база данных SQLite, доступная в макросе StarBasic через ODBC.
Научите, пожалуйста, как  программно отлавливать коды ошибок, возвращаемые в ходе выполнения SQL-запросов к внешней базе данных.
Функция
Код:
Function _SQLiteDML(sDBName, sSQLCommand as String)

RowSet = createUnoService("com.sun.star.sdb.RowSet") ' делаем сервис
RowSet.DataSourceName = sDBName ' имя базы LO  (odb) без расширения
RowSet.CommandType = com.sun.star.sdb.CommandType.COMMAND 'команда
RowSet.EscapeProcessing=False 'запрещаем парсинг sql-фраз средствами LO Base

RowSet.Command=sSQLCommand
On Error Goto Handler
RowSet.execute() ' выполняем
Handler:
MsgBox("Ошибка в строке: " & Erl & " Код: " & Err & " Текст: " & Error)
On Error GoTo 0
End Function '_SQLiteDML
возвращает один и тот же код ошибки не смотря на различные ошибочные ситуации. Например,  попытку записи не уникального значения в поле с ограничением на уникальность и попытку записи данных в несуществующее поле из макроса различить не получится. Подозреваю, что таким образом ошибки, генерируемые внешними библиотеками не ловятся.
Расскажите, пожалуйста, как отлавливать такие ошибки или ткните носом в место, где об этом можно почитать.
« Последнее редактирование: 17 Апрель 2017, 11:39 от ost » Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 314


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #1: 17 Апрель 2017, 12:35 »

возвращает один и тот же код ошибки не смотря на различные ошибочные ситуации
Какой номер ошибки?

Попробуйте так:
Код:
Function _SQLiteDML(sDBName, sSQLCommand as String)
On Error Goto Handler   'с этого места начнётся обработка ошибок (лучше если это будет в начале макроса)

RowSet = createUnoService("com.sun.star.sdb.RowSet") ' делаем сервис
RowSet.DataSourceName = sDBName ' имя базы LO  (odb) без расширения
RowSet.CommandType = com.sun.star.sdb.CommandType.COMMAND 'команда
RowSet.EscapeProcessing=False 'запрещаем парсинг sql-фраз средствами LO Base

RowSet.Command=sSQLCommand
RowSet.execute() ' выполняем
Exit Function   'если нет ошибок выходим из функции здесь, а не "высасываем из пальца" не существующую ошибку
Handler:
MsgBox("Ошибка в строке: " & Erl() & " Код: " & Err() & " Текст: " & Error())
On Error GoTo 0
End Function
Записан

ost
Пользователь
**
Offline Offline

Сообщений: 73


« Ответ #2: 17 Апрель 2017, 18:01 »

Проблема решилась частично.
Теперь можно обрабатывать текст ошибки. Спасибо.

Картинки:
https://yadi.sk/i/D9IaC3mU3H4pBB
https://yadi.sk/i/C1bUznv23H4pMF
Записан
economist
Ветеран
*****
Offline Offline

Сообщений: 761


« Ответ #3: 18 Апрель 2017, 08:44 »

ost - уже неплохо.

У движка SQLite часть SQL-ных ошибок - ошибками не является из-за её утиной типизации и упрощенной работы с литералами. Например, запрос несуществующего поля
SELECT NonExistsField FROM... - выведет вместо ожидаемого значения этого поля - само название поля в виде строки "NonExistsField".

Благодаря простоте SQLite поддерживет выражения до FROM, после него - выражения с псевдонимами, не требует явной группировки для агрегирующих функций итп плюшки, которые нужно просто знать и любить ими пользоваться. 

Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!