С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 25.05.2008
Сообщений: 232

Метод, возвращающий рекордсет

21.12.2008, 14:13. Показов 1566. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
у меня есть класс и в нем методы типа
Visual Basic
1
2
3
4
5
6
7
Public Function getCity(regionCode As String, areaCode As String, cityCode As String, pointCode As String) As Recordset
Dim query As String
 Set getCity = New ADODB.Recordset
 query = 'SELECT * FROM kladr WHERE code LIKE ' & _
 ''' & regionCode & '0' & areaCode & '0' & cityCode & '' & pointCode & '' AND socr='д''
 getCity.Open query, cnMain, adOpenForwardOnly, adLockReadOnly
End Function
Которые возвращают рекордсеты.
Если в программе я пишу set rs=getCity(....)
то что происходит с самим методом? Я имею ввиду память ведь не освобождается от рекордсета, который сгенерирован методом?
Или память теперь занимает только новый rs? или еще что то?

Что то я запутался :-((
Пиплы просветите!!

Заранее сенксы
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.12.2008, 14:13
Ответы с готовыми решениями:

Не работает рекордсет на гриде
Народ, привет! Гляньте, плиз, вот это: Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.Open...

Почему не обновляется рекордсет?
почему? Всегда когда я внощу данные в рекордсет и затем делаю recset.update он никогда не обновляется. Приходится его закрывать, открывать,...

Interbase + ADO, рекордсет не заполняет
Пытаюсь подключится к базе interbase через ADO : Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn =...

12
 Аватар для palva
4276 / 2969 / 692
Регистрация: 08.06.2007
Сообщений: 9,922
Записей в блоге: 4
21.12.2008, 22:27
Я думаю, что вас путает утверждение некоторых учебников, что команда
Code
1
Set oVar = Nothing
освобождает память, занятый объектом oVar и разрушает сам объект. Следующий работающий пример показывает, что это не так.
Code
1
2
3
4
5
6
7
8
Set pogoda = CreateObject('Scripting.Dictionary')
pogoda('London') = 'туман'
pogoda('Неаполь') = 'ясно'
pogoda('Москва') = 'пасмурно'
pogoda('Гадюкино') = 'дожди'
Set new_pogoda = pogoda
Set pogoda = Nothing
MsgBox new_pogoda('Гадюкино')
На самом деле объектная переменная содержит не сам объект, а ссылку на него. Объект может иметь несколько ссылок, а присваивание Nothing всего лишь информирует бейсик-систему, что данная объектная переменная больше не будет использоваться в качестве ссылки на объект. Таким образом, бейсик подсчитывает сколько ссылок указывает на данный объект, и в момент когда количество ссылок станет равным нулю понимает, что объект можно уничтожать и память освобождать. Делает ли это бейсик на самом деле - бог весть... Если кто-нибудь знает, как это можно проконтролировать из бейсик-программы, было бы интересно услышать. Косвенным образом об этом судить можно. Скажем, функция создает объект и возвращает ссылку на него. Если в основной программе эта ссылка не будет сохранена, то доступа к объекту не будет. Но произойдет ли утечка памяти, то есть не будет ли объект, созданный в функции занимать память? Если мы напишем функцию
Code
1
2
3
4
Function pogoda()
Set pogoda = CreateObject('Scripting.Dictionary')
pogoda.item('London') = 'туман'
End Function
и обратимся к ней несколько миллионов раз следующим образом
Code
1
s = pogoda()('London')
то в случае утечки памяти в какой-то момент мы должны получить какие-то сообщения о нехватке памяти или об увеличении файла подкачки. Но поскольку этого не происходит, то...

Может есть другие гипотезы?
0
1 / 1 / 0
Регистрация: 25.05.2008
Сообщений: 232
22.12.2008, 08:24  [ТС]
Спасибо огромное.
Немного прояснилась обстановка...
0
1 / 1 / 0
Регистрация: 25.05.2008
Сообщений: 232
22.12.2008, 09:31  [ТС]
А почему с рекордсетами происходит следующая вещь:

есть открытый рекордсет rs1.

set rs2=rs1
set rs1=nothing

msgbox rs2.RecordCount <- не сработает, тк rs2 тоже разрушен.

Заранее спасибо
0
0 / 0 / 0
Регистрация: 26.12.2007
Сообщений: 435
22.12.2008, 11:42
не считаю что пример с использованием
rs2.RecordCount
корректен, так как он может по разным причинам не выводить число записей. Плюс ко всему - рекордсеты вообще вещь особенная.
0
1 / 1 / 0
Регистрация: 25.05.2008
Сообщений: 232
22.12.2008, 11:44  [ТС]
но ведь рекордсет тоже объект...
0
 Аватар для palva
4276 / 2969 / 692
Регистрация: 08.06.2007
Сообщений: 9,922
Записей в блоге: 4
22.12.2008, 15:53
Следующий VBScript работает - выдает два раза '-1'
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
SET cn = CreateObject('ADODB.Connection')
SET rs = CreateObject('ADODB.Recordset')
cn.Open 'prices'
rs.Open 'SELECT * FROM prices', cn, 2, 2
MsgBox rs.RecordCount
Set rs1 = rs
set rs = Nothing
MsgBox rs1.RecordCount
MsgBox rs1.Fields('id')
rs1.Close
set rs1 = Nothing
cn.Close
set cn = Nothing
Действительно, объект не хочет возвращать число записей, но он вполне работоспособен, читается, закрывается и проч.
0
0 / 0 / 0
Регистрация: 21.05.2007
Сообщений: 252
22.12.2008, 19:39
Property RecordCount vozvraschaet chislo zapisei tol'ko posle vypolneniya komandy Rs1.MoveLast, a bez etoi komandy vsegda -1. No daze Microsoft ne sovetyet ispol'zovat' MoveLast metod poskol'ku on sil'no zamedlyaet obrabotku.
0
1 / 1 / 0
Регистрация: 27.08.2008
Сообщений: 154
22.12.2008, 20:07
It is depends on your cursor location and cursortype,you can receive RecordCount without MoveLast, if you cursor on the Client Side and is not Dynamic
0
 Аватар для palva
4276 / 2969 / 692
Регистрация: 08.06.2007
Сообщений: 9,922
Записей в блоге: 4
22.12.2008, 21:52
Например, скрипт приведенный выше возвращает правильное количество записей, если открывать его командой
Code
1
rs.Open 'SELECT * FROM prices', cn, 3, 3
Но здесь мы обсуждаем совсем другой вопрос, а именно: отличаются ли функционально объекты rs и rs1.
0
0 / 0 / 0
Регистрация: 26.12.2007
Сообщений: 435
23.12.2008, 06:08
Вернувшись к вопросу чисто логически можно предположить что память от рекордсета не освободится - там ведь (в методе) нет закрытия рекордсета и его высвобождения. Предлагаю проверить следующим Методом:
set rs=getCity(....)
..........Используем рекордсет
set rs=nothing

set rs2=rs (интересно, а такое вообще работать будет? Вроде должно.)
..........Пытаемся использовать рекордсет
set rs2=nothing

Интересно, что выведет второй рекордсет?
Но в любом случае getCity будет открыт. Ну и наверно памяти тоже хапнет.
0
1 / 1 / 0
Регистрация: 25.05.2008
Сообщений: 232
24.12.2008, 08:39  [ТС]
Последний постинг работать не будет!

Я выяснил, что если мы имеем открытый рекордсет rs1 то
Visual Basic
1
2
set rs2=rs1
set rs1=nothing
то rs2 продолжает полноценную жизнь! А rs1 умер.

А вот если я имею библиотеку АктивХ dll, в ней класс, в классе методы которые возвращают рекордсеты. А именно:
Visual Basic
1
2
3
4
5
6
7
Public Function getCity(regionCode As String, areaCode As String, cityCode As String, pointCode As String) As Recordset
Dim query As String
Set getCity = New ADODB.Recordset
query = 'SELECT * FROM kladr WHERE code LIKE ' & _
''' & regionCode & '0' & areaCode & '0' & cityCode & '' & pointCode & '' AND socr='д''
getCity.Open query, cnMain, adOpenForwardOnly, adLockReadOnly
End Function
В программе
Set AddrObj = New Kladr.Address определение объекта.

и если его уничтожить set AddrObj=nothing, то все рекордсеты которые были возвращены его методами теряют функциональность! Но не уничтожаются...
0
0 / 0 / 0
Регистрация: 26.08.2008
Сообщений: 53
25.12.2008, 11:01
По идее объект существует, пока на него есть хоть одна ссылка, при высвобождении всех ссылок сборщик мусора должен уничтожить его автоматически. Но увы, не раз сталкивался с тем что сборщик мусора в VB глючит..
dim adoRs as adodb.recordset
dim adoRs1 as adodb.recordset

set adoRs=new adodb.recordset
adoRs.open '.....'
set adoRs=adoRs1
AdoRs1 хранит токо ссылку на Recordset

set adoRs=new adodb.recordset
adoRs.open '.....'
set adoRs1=new adodb.recordset
set adoRs1=adoRs.clone
AdoRs1 хранит экземпляр Recordset'а
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.12.2008, 11:01
Помогаю со студенческими работами здесь

Как в Excel добавить рекордсет?
как в Exel добавить рекордсет в определенные ячейки но в одну строку, записей неизвестное кол-во??? А потом в конец добавить другой...

Вывод формулы из рекордсет на текстбокс
Mne nuzno vivesti na TextBox ne field iz Recordset, a formulu, tipo: field_name*5. Podskazite mozno li eto sdelat? Esli da, to kakim...

Как сохранить рекордсет в таблицу?
Собственно, сабж. Т.е. sql-запросом создан рекодсет и его надо сохранить в таблицу (таблицы нет) c каким-нито именем , в базе аксовой. ...

Как создать рекордсет из уже существующих?
Как создать рекордсет из уже существующихрекордсетов в VB? Например есть набор r1 и r2 надо создать r3 в котором будут поля и первого...

База на MySQL возвращает пустой рекордсет.
Помогите пожалуйста разобраться, второй день бьюсь, не получается. база на MySQL возвращает пустой рекордсет. ... Set cnn1 =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru