powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / жадные datagrid+recordset
7 сообщений из 7, страница 1 из 1
жадные datagrid+recordset
    #38011412
roman.a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем здравствуйте. Столкнулся с интересной проблемой, которую не могу решить уже второй день. У меня есть программа, написанная достаточно давно. В последнее время пользователи начали жаловаться на то, что при достаточно продолжительной работе программа начинает сильно тормозит. Пользователям я особо не верил, пока сам не проверил - действительно происходит чтото непонятное. При работе программа все больше и больше откушивает оперативной памяти и в результате просто напросто виснет. После нескольких часов изысканий и тестов пришел к следующему:
создал форму, кинул на него трудбгрид и 2 баттона. Ниже привожу оч простенький код формы:
Код Visual Basic
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Dim rs1 As ADODB.Recordset
 
Private Sub Command1_Click()
 
Set rs1 = New ADODB.Recordset
rs1.Open "SELECT * FROM MyTable", adolocal, adOpenStatic, adLockOptimistic
dg1.DataSource = rs1 
 
End Sub
 
Private Sub Command2_Click()
 
Dim i As Integer
For i = 0 To 100
   adolocal.Execute "INSERT INTO MyTable ..."
    rs1.Requery
Next i
 
End Sub



Ну вот как бы и совсем все просто. На первой кнопке заполняю грид данными из таблицы. Вторая кнопка имитирует пользователя, которые добавляет 100 записей в таблицу, при этом рекордсет, ну и как следствие грид обновляется, пользователь видит результат своих действий. При каждом нажатии на кнопку 2 эта простенькая формочка "внаглую отжирает" по 3 метра оперативы. Если вот этот код убрать
Код: vbnet
1.
dg1.DataSource = rs1 


то все работает отлично. Но, как вы понимаете, бедный пользователь не видит результат своего труда.
И вот тут я совсем теряюсь. Код элементарный, вродеб какбы все должно работать и не работает. Раньше подключения были на адошных объектах, без рекордсетов, все работало стабильно, но оч медленно, поэтому к этому варианту не хочется возвращаться.
...
Рейтинг: 0 / 0
жадные datagrid+recordset
    #38011552
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roman.a,

ну возвращайте TOP 1000 первых записей из таблицы, а не всю её
...
Рейтинг: 0 / 0
жадные datagrid+recordset
    #38011570
kiv-1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну очищай память, после того как отработал курсор я его делаю
Код: vbnet
1.
set rs = Nothing

Вроде мелочь, но вошло в привычку, обнулять курсоры и переменные после их использования.
Код: vbnet
1.
2.
3.
4.
Set rs1 = New ADODB.Recordset
rs1.Open "SELECT * FROM MyTable", adolocal, adOpenStatic, adLockOptimistic
dg1.DataSource = rs1
Set rs1 = Nothing
...
Рейтинг: 0 / 0
жадные datagrid+recordset
    #38011581
roman.a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в табличке и так записей совсем немного. Более того, если в таблице сделать 100-500 записей, ну и в событии второго баттона в цикле закомментировать операцию добавления, а просто делать rs1.Requery, то память кушается точно также. Т.е. возникает чувство, что при каждом rs1.Requery старые данные из датагрида не убиваются, а где-то остаются. Причем, если форму закрыть и снова открыть - то из оперативной памяти ничего не уходит, хотя везде написано, да и сам я наскок помню, в бэйсике как только ссылка на переменную(объект) убивается то и память освобождается. Оперативка очищается только если закрыть приложение полностью.
...
Рейтинг: 0 / 0
жадные datagrid+recordset
    #38011603
roman.a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kiv-1980, безусловно, set rs = nothing - это тож привычка. Просто в примере не написал. Тем не менее эта строчка ничем не помогает, я её пробовал и внутри цикла ставить и применительно к датасурсу датагрида. Ну и это действие вообще должно наверно происходить на закрытии формы, иначе если рекордсет обнулить раньше времени - то обнулится и датагрид, разве нет?
...
Рейтинг: 0 / 0
жадные datagrid+recordset
    #38011616
roman.a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
roman.akiv-1980, безусловно, set rs = nothing - это тож привычка. Просто в примере не написал. Тем не менее эта строчка ничем не помогает, я её пробовал и внутри цикла ставить и применительно к датасурсу датагрида. Ну и это действие вообще должно наверно происходить на закрытии формы, иначе если рекордсет обнулить раньше времени - то обнулится и датагрид, разве нет?
не совсем правильно написал ). Безусловно эта строка помогает и я её ставлю всегда там где надо, например на закрытии формы. На каждый сет обязан быть свой сет=носинг. Но в данном случае (а случай то вроде стандартный) внутри цикла данная строка не дает никаких результатов. К тому же, как я уже писал, если датагриду не назначать в качестве датасурса рекордсет, то все работает очень даже хорошо, и память совершенно не растет, правда и пользователю в гриде ничего не видно.
...
Рейтинг: 0 / 0
жадные datagrid+recordset
    #38011811
kiv-1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант попробуйте копать в сторону redraw грида, правда в трудбгриде, это реализовано мудрено. Отключать при начале и включать redraw по окончании заполнения. С msflexgrid- это помогает неплохо.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / жадные datagrid+recordset
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]