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

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

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

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice  без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Создание временной таблицы в базе данных из StarBasic  (Прочитано 1046 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ost
Пользователь
**
Offline Offline

Сообщений: 73


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

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

Первый
Код:
Sub CreateTable1()
On Error Resume Next  
oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oDB = oBaseContext.getByName("RegBL")
oCon = oDB.getConnection("", "")
oStatement = oCon.createStatement()
sCommandSQL = "CREATE TABLE IF NOT EXISTS Table1 (id, Name, Data)"
oStatement.executeQuery(sCommandSQL)
oDB.store()
sCommandSQL = "INSERT INTO Table1 (id, Name, Data) VALUES (1,2,3)"
oStatement.executeQuery(sCommandSQL)
oDB.DatabaseDocument.store()
oCon.close()
On Error GoTo 0
End Sub

Второй
Код:
Sub CreateTable2()
On Error Resume Next  
oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oDB = oBaseContext.getByName("RegBL")
oCon = oDB.getConnection("", "")
oStatement = oCon.createStatement()
sCommandSQL = "CREATE TEMP TABLE IF NOT EXISTS Table2 (id, Name, Data)"
oStatement.executeQuery(sCommandSQL)
oDB.store()
sCommandSQL = "INSERT INTO Table2 (id, Name, Data) VALUES (1,2,3)"
oStatement.executeQuery(sCommandSQL)
oDB.DatabaseDocument.store()
oCon.close()
On Error GoTo 0
End Sub
Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #1: 23 Апрель 2017, 18:23 »

Может быть вместо:
Код:
sCommandSQL = "CREATE TEMP TABLE IF NOT EXISTS Table2 (id, Name, Data)"
нужно:
Код:
sCommandSQL = "CREATE TEMPORARY TABLE IF NOT EXISTS Table2 (id, Name, Data)"


P.S. это вопрос не по Basic, а по SQLite. Читайте документацию по SQLite: SQLite Query Language: CREATE TABLE
« Последнее редактирование: 23 Апрель 2017, 18:42 от rami » Записан

kompilainenn
Ветеран
*****
Offline Offline

Сообщений: 2 127



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

P.S. это вопрос не по Basic, а по SQLite
пришла пора создать отдельный раздел форума про SQlite?
Записан

Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #3: 23 Апрель 2017, 19:26 »

P.S. это вопрос не по Basic, а по SQLite
пришла пора создать отдельный раздел форума про SQlite?
Не думаю, если код Basic работает, а код SQlite нет, то лучше искать на форумах SQlite, нам за ними не угнаться. В крайнем случае, можно обсуждать проблемы SQlite в разделе Base.
Записан

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

Сообщений: 73


« Ответ #4: 23 Апрель 2017, 19:39 »

"TEMPORARY" вместо "TEMP"  не помогло.
Выполнение "CREATE TEMP TABLE IF NOT EXISTS Table2 (id, Name, Data)" и в консоли от разработчиков SQLite, и в стороннем менеджере баз приводит к созданию временной таблицы. Но из Basic не получается.
Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #5: 23 Апрель 2017, 19:56 »

Но из Basic не получается.
А на что жалуется Basic? Уберите из кода On Error Resume Next
Записан

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

Сообщений: 73


« Ответ #6: 23 Апрель 2017, 20:19 »

Говорит, что "Запрос не вернул допустимого набора значений."
Таак...
строка вида
Код:
CREATE TEMP TABLE Table2 (id, Name, Data)
возвращает ошибку:
Ошибка времени выполнения BASIC.
Вызвано исключение
Type: com.sun.star.sdbc.SQLException
Message: table Table2 already exists (1).

Однако запрос в менеджере баз
Код:
SELECT * FROM sqlite_temp_master WHERE type='table'
ничего не возвращает.
Такое ощущение что Table2 создается где-то не в текущей базе. O_o
« Последнее редактирование: 23 Апрель 2017, 20:32 от ost » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 373


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #7: 23 Апрель 2017, 22:07 »

Такое ощущение, что executeQuery относится к запросам SELECT.
А запросы типа CREATE, INSERT или UPDATE (ну, которые не должны что-то возвращать) ожидают какого-то другого метода, нет?
« Последнее редактирование: 23 Апрель 2017, 22:40 от JohnSUN » Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
economist
Ветеран
*****
Offline Offline

Сообщений: 761


« Ответ #8: 24 Апрель 2017, 08:33 »

Создание таблицы (удаление, вставка строк итп) - не возвращает набора значений. Никакой ошибки нет, её надо просто игнорить.

Эту же "ошибку" дает и GUI OpenOffice|LibreOffice, при выполнении Сервис-SQL с любым DDL-запросом.
« Последнее редактирование: 24 Апрель 2017, 08:39 от economist » Записан

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

Сообщений: 73


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

А запросы типа CREATE,y INSERT или UPDATE (ну, которые не должны что-то возвращать) ожидают какого-то другого метода, нет?
Может быть. Попробую. Но ведь обычная таблица этим методом создается. А вот временная - нет. Или я не знаю где ее искать..=(
Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #10: 24 Апрель 2017, 19:36 »

Но ведь обычная таблица этим методом создается. А вот временная - нет. Или я не знаю где ее искать..=(
Message: table Table2 already exists (1). — говорит что таблица есть, но не говорит где Смеющийся

А Документация что говорит? Temporary Files Used By SQLite
Записан

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

Сообщений: 73


« Ответ #11: 27 Апрель 2017, 09:08 »

Прочитал. Не понял, как же мне, все-таки, получить доступ к временной таблице из Basic. Как запросить данные временной таблицы из макроса? Как записать туда новые данные?
Записан
economist
Ветеран
*****
Offline Offline

Сообщений: 761


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

ost - создавайте нормальную таблицу и грохайте её потом. Это быстрее, чем разбираться с Basic. Временная таблица существует во время коннекта, после Close или Commit она может исчезать.

С тем же SQLite я пришел к выводу, что если в таблице из 10000 строк изменились 100, но есть пара индексов - дешевле, быстрее и проще удалить таблицу, создать таблицу, создать индексы, импортировать все заново - чем делать вычурный Update. И Вам советую - не парьтесь.
Записан

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

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