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

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

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

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

Сообщений: 69


« Ответ #15: 25 Февраль 2017, 05:47 »

Доброго. Помогите, пожалуйста, разобраться.

Экспериментировал с цитируемым кодом и заметил что в случае использования
Код:
rowSet.First ' вернулись к первой записи. Теперь можно циклом перебрать 
результат некорректен: первая запись выборки теряется.
Если же rowSet.First не использовать, то выборка корректна.
Ощущений два =):
1) что rowSet.First устанавливает указатель на вторую строку объекта RowSet;
2) что после выполнения RowSet.execute() указатель установлен на "никуда" и только RowSet.next (или rowSet.First) устанавливает указатель на первую строку объекта RowSet.

Осталось решить вопрос о том, какое из них ближе к истине. Второе?


Перебор результата делал с помощью такой функции:
Код:
Function CreateResultArrayFromQuerry(ResultSet)
'ResultSet - результат запроса, получаемый по 'RowSet.execute()'

lRowCounter=-1

If Not IsNull(ResultSet) Then
iCols=ResultSet.Columns.Count 'iCols-Количесто полей в запросе/целевой таблице
While ResultSet.next 'перебираем значения результатов sql-запроса

Redim aCol(iCols-1) 'Создаем / 'Очищаем' массив перед получением данных следующей записи
For lColCounter=0 to iCols-1 '
aCol(lColCounter)=ResultSet.getString(lColCounter+1)
Next

lRowCounter=lRowCounter+1
redim preserve aStr(lRowCounter)
aStr(lRowCounter)=aCol()

Wend
CreateResultArrayFromQuerry=aStr()
End If
End Function 'CreateResultArrayFromQuerry


В BASIC-коде лучше все данные из БД закачивать в динамический объект типа RecordSet, который по сути предоставляет самый быстрый и бесконфликтный способ подвыборки, изменения и удаления данных в базе.
Сейчас могу лишь копипастнуть свой код:

Код:
RowSet = createUnoService("com.sun.star.sdb.RowSet") ' создаем
RowSet.DataSourceName = "YourDataBase" ' указываем зарегистрированную базу данных, без *.odb!
RowSet.CommandType = com.sun.star.sdb.CommandType.COMMAND ' вызываем команду
RowSet.EscapeProcessing=FALSE
SQLSTR="SELECT * FROM СОТР"
RowSet.Command = SQLSTR 'задаем команду для набора строк
'On Error Goto ErrSQL
RowSet.execute() ' выполняем
rowSet.Last 'мотнули курсор к концу, чтобы узнать сколько строк
RowEND=(rowSet.RowCount()-1)
rowSet.First ' вернулись к первой записи. Теперь можно циклом перебрать 


Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #16: 25 Февраль 2017, 10:15 »

Экспериментировал с цитируемым кодом и заметил что в случае использования
Код:
rowSet.First ' вернулись к первой записи. Теперь можно циклом перебрать
результат некорректен: первая запись выборки теряется.
Если же rowSet.First не использовать, то выборка корректна.
Ощущений два =):
1) что rowSet.First устанавливает указатель на вторую строку объекта RowSet;
2) что после выполнения RowSet.execute() указатель установлен на "никуда" и только RowSet.next (или rowSet.First) устанавливает указатель на первую строку объекта RowSet.

Осталось решить вопрос о том, какое из них ближе к истине. Второе?
Ближе к истине третье:
Код:
rowSet.First ' вернулись к первой записи. Теперь можно циклом перебрать
действительно устанавливает первую запись, но дальше в функции CreateResultArrayFromQuerry(ResultSet) строка кода
Код:
While ResultSet.next 'перебираем значения результатов sql-запроса
сразу переводит на вторую запись и с неё начинает перебор. Самое простое решение — заменить rowSet.First на rowSet.beforeFirst
Записан

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

Сообщений: 69


« Ответ #17: 26 Февраль 2017, 17:41 »

Спасибо. Уяснил.
Вот ссылочка. Там и примеры есть. Возможно, кому-нибудь поможет разобраться быстрее.
http://tutorials.jenkov.com/jdbc/resultset.html
Записан
Страниц: « 1 2   Вверх
  Печать  
 
Перейти в:  

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