Управление транзакциями из StarBasic в LibreOffice

Автор ost, 1 мая 2017, 17:35

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

ost

Доброго.
Я так понял, что для начала транзакции следует установить свойство autocommit объекта  oConnection в состояние false.
После чего все sql-команды до явного выполнения oConnection.commit() будут выполнены в одной транзакции.
Выполнение кода вызывает ошибку  "This call is not allowed when sharing connections.." на строке "oConnection.setAutoCommit(false)"
Растолкуйте, пож., в чем проблема. О каком совместном использовании подключений идет речь?

Function _ConnectToDataBase(dbName as String) as Object
'===Функция подключения к Базе данных
'dbName - Полный путь к базе данных (раширение .odb обзяательно) в формате URLconvertToURL
Dim dbContext As Object, oDataSource As Object
dbContext=createUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource=dbContext.getByName(dbName)
oConnection=oDataSource.GetConnection("","")
oConnection.setAutoCommit(false)
_ConnectToDataBase=oConnection
End Function


economist

Диагностические сообщения в Base - это особая песня. Тут видимо oConnection просто не поддерживает такой параметр setAutoCommit, а называет "наиболее вероятную" причину.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ost


economist

А какая СУБД (движок) используется?
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ost


economist

В случае с SQLite - Autocommit mode is on by default. Autocommit mode is disabled by a BEGIN statement. Autocommit mode is re-enabled by a COMMIT or ROLLBACK.

То есть включать его не нужно. Более того, отключение его - зело повышает производительность почти любых запросов, и особенно вставку и обновление данных, особенно малопользовательскую, по LAN. Ведь SQLite - однофайловая БД, в которой внутренняя адресация идет по "смещениям", а COMMIT означает запись файла на диск (или журнала). Не нужен вам Autocommit, если база не IN-MEMORY.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ost

Цитата: economist от 15 мая 2017, 10:32То есть включать его не нужно
Нужно его отключить. Не пойму как работать с транзакциями из Starbasic.

economist

ost - Вам нужны ручные транзакции (набор нескольких действий, которые можно откатывать назад ОДНИМ действием). Бонусом будет общее ускорение, особенно при множественной вставке, удалении, обновлении итп.

Но транзакции в SQLite - автоматические (это режим Autocommit). Чтобы их (и его) отключить - просто перед UPDATE/INSERT/DELETE-инструкцией - добавьте вверху BEGIN TRANSACTION; И все, транзакция началась, Autocommit выключился, чтобы команда реально выполнился - нужно применять COMMIT; Ну как еще объяснить? См. http://www.sqlitetutorial.net/sqlite-transaction/   
 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...