Код ошибки базы данных, подключенной через ODBC-драйвер

Автор ost, 17 апреля 2017, 11:35

0 Пользователи и 1 гость просматривают эту тему.

ost

Доброго.

Есть база данных 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

возвращает один и тот же код ошибки не смотря на различные ошибочные ситуации. Например,  попытку записи не уникального значения в поле с ограничением на уникальность и попытку записи данных в несуществующее поле из макроса различить не получится. Подозреваю, что таким образом ошибки, генерируемые внешними библиотеками не ловятся.
Расскажите, пожалуйста, как отлавливать такие ошибки или ткните носом в место, где об этом можно почитать.

rami

Цитата: ost от 17 апреля 2017, 09: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

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

Картинки:
https://yadi.sk/i/D9IaC3mU3H4pBB
https://yadi.sk/i/C1bUznv23H4pMF

economist

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

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

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

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