Проблема сохранения данных в базе, после выполнения макроса

Автор AlexWorkStream, 13 ноября 2017, 13:07

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

AlexWorkStream

Столкнулся с интересной проблемой, после выполнения макроса

Sub InsertIntoBase

Dim oSheet, oRangeAddress, db, oStatement, i%, col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, oSql$

oSheet=ThisComponent.CurrentSelection.getSpreadsheet
oRangeAddress=oSheet.getCellRangeByName("A2").RangeAddress
db=ConnectToDataBase("КАТАЛОГ_Новая_База")
oStatement=db.createStatement

For i=oRangeAddress.startRow To oRangeAddress.EndRow
col1=oSheet.getCellByPosition(0,i).Value
col2=oSheet.getCellByPosition(1,i).String
col3=oSheet.getCellByPosition(2,i).String
col4=oSheet.getCellByPosition(3,i).String
col5=oSheet.getCellByPosition(4,i).String
col6=oSheet.getCellByPosition(5,i).String
col7=oSheet.getCellByPosition(6,i).String
col8=oSheet.getCellByPosition(7,i).Value
col9=oSheet.getCellByPosition(8,i).String
col10=oSheet.getCellByPosition(9,i).String


oSql="INSERT INTO ""Категории"" " & "(""ID"",""Категории (рус)"",...) values " & _
"(" & col1 & ",...)"

oResult=oStatement.executeQuery(oSql)
Next
DisconnectFromDataBase(db)
End Sub


'функция подключения к базе
Function ConnectToDataBase(dbName$) As Object

Dim dbContext As Object, oDataSource As Object
dbContext=createUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource=dbContext.getByName(dbName)
ConnectToDataBase=oDataSource.GetConnection("","")

End Function


'процедура отключения
Sub DisconnectFromDataBase(db As Object)

db.close
db.dispose()

End Sub


после закрытия Calc - данные в базе не сохраняются. Но если, после выполнения скрипта, открыть базу отдельно или по ctrl+shift+F4, тогда все сохраниться (ничего не делая, просто открыть и закрыть).

Может кто сталкивался с данной проблемой?

JohnSUN

А почему для INSERT используется executeQuery?..
Здесь пишут, что
ЦитироватьXResultSet    executeQuery () raises (SQLException)
   executes the SQL query in this PreparedStatement object and returns the result set generated by the query. More...

long    executeUpdate () raises (SQLException)
   executes the SQL INSERT, UPDATE or DELETE statement in this com::sun::star::sdbc::PreparedStatement object. More...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

AlexWorkStream

Цитата: JohnSUN от 13 ноября 2017, 11:28А почему для INSERT используется executeQuery?..
С Update - все тоже самое. База не обновляется, пока ее не запустишь.
Получается как-то хитро, после выполнения макроса и обновления диапазонов, в которые импортируются данные из базы, так вот в этих диапазонах данные появляются, но после закрытия документа - все исчезает...

mikekaganski

С уважением,
Михаил Каганский

AlexWorkStream


mikekaganski

Я просто предположил, исходя из API. Если это оно, то его нужно использовать в DisconnectFromDataBase
С уважением,
Михаил Каганский

AlexWorkStream

Цитата: mikekaganski от 13 ноября 2017, 13:06Если это оно, то его нужно использовать в DisconnectFromDataBase
Спасибо, теперь все сохраняется. Получилось так:

Sub DisconnectFromDataBase(db As Object)

db.flush()
db.close
db.dispose()

End Sub

Только теперь вопрос, нужен ли dispose()?