Как хитро сделать копию ADODB рекордсета

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Как хитро сделать копию ADODB рекордсета

Сообщение ger_kar » 18.10.2014 (Сб) 17:48

Потребовалось мне сделать копию адошного рекордсета, именно копию, а не клон. И впал я в глубокое уныние. Копию конечно сделать можно, но это просто адски не эффективная операция с кучей циклов и переборов коллекций. Т.е. сначала нужно перебрать коллекцию столбцов исходного рекордсета и сделать аналогичные в создаваемом. Затем перебор набора записей и для каждой опять перебор коллекции столбцов. Кошмар да и только :( Собственно это и навевает уныние. Хотелось бы это проделывать гораздо более изящно и эффективно. Конечно способ с переборами тоже имеет некоторые преимущества, например некая модификация исходного рекордсета в процессе копирования, но все остальные недостатки это все перечеркивают. Самый эффективный (на мой взгляд) метод, это взять да и скопировать исходную область памяти в другое место (естественно предварительно выделив под это дело определенную область), ну и вдогонку проделать некие манипуляции с присвоением ссылки нужной переменной, увеличить счетчик ссылок и т.п. Это все хорошо, но проблема в том, что рекордсет это не некий монолитно-единый объект, а система таковых, с кучей интерфейсов и все такое. И все это явно не одна непрерывная область памяти. И что то мне подсказывает, что метод с "просто копированием" тут не прокатит. Но и с перебором тоже не охота мириться. Так где же выход? Задам думаю вопрос на форуме, вдруг будет лавина идей :roll:
Бороться и искать, найти и перепрятать

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Как хитро сделать копию ADODB рекордсета

Сообщение The trick » 18.10.2014 (Сб) 21:13

Вообще Recordset имеет метод Clone.
Еще как вариант через PropertyBag.
Код: Выделить всё
Dim p As New PropertyBag
' Получаем рекрдсет
Set Rc = DB.Execute("SELECT * FROM tblMain")
' Сохраняем
p.WriteProperty "Rec", Rc
' Восстанавливаем
Set Rc = p.ReadProperty("Rec")
UA6527P

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как хитро сделать копию ADODB рекордсета

Сообщение ger_kar » 18.10.2014 (Сб) 21:34

Интересный вариант. Надо попробовать. Но насколько я помню для коллекции такое не применимо, а в составе рекордсета есть как минимум две коллекции - коллекция столбцов и коллекция динамических свойств. У меня смутное чувство, что это не прокатит, хотя надо попробовать. Кстати, а куда при таком применении сохраняются сериализованные данные? Во временный файл, или все делается через память? В случае свойств контрола все понятно, а тут как то не очень. Если во временный файл, то в какой?
Бороться и искать, найти и перепрятать

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Как хитро сделать копию ADODB рекордсета

Сообщение The trick » 18.10.2014 (Сб) 21:55

Я тебя не пойму. Чем не устраивает метод Clone?
Через PropertyBag сохраняется весь рекордсет вместе со всеми свойствами. Свойства сохраняются в объекте PropertyBag, оттуда можешь сохранять куда хочешь. Можешь через IPersistStream к примеру попробовать или через любой другой производный от IPersist.
UA6527P

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как хитро сделать копию ADODB рекордсета

Сообщение ger_kar » 18.10.2014 (Сб) 22:15

The trick писал(а):Я тебя не пойму. Чем не устраивает метод Clone?
Мне нужна копия, а не клон. Клон рекордсета, как и родитель, при всем том, что они являются разными объектами, тем не менее работают с одним и тем же набором данных. И изменение набора через клон, влечет изменение набора родителя, так как это по сути тот же набор. А мне нужна его копия (самого набора данных), никак не связанная с оригиналом.

Проверил, действительно работает. Это конечно странно, так как я помню, что читал, причем не абы где, а на MSDN, что PropertyBag не применим для коллекций. Может в составе рекордсета несколько другие по устройству коллекции, и все храниться одним куском, а не в виде связного списка, как в случае с VB' шной коллекцией. Кстати нужно попробовать использовать такой же подход, для копирования рекордсета, не целиком, а по полям. И тогда можно будет модифицировать рекордсет (по составу полей) при копировании.
Бороться и искать, найти и перепрятать

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Как хитро сделать копию ADODB рекордсета

Сообщение Vi » 20.10.2014 (Пн) 9:43

ger_kar писал(а):... я помню, что читал, причем не абы где, а на MSDN, что PropertyBag не применим для коллекций. Может в составе рекордсета несколько другие по устройству коллекции, и все храниться одним куском, а не в виде связного списка, как в случае с VB' шной коллекцией.

Все коллекции похожи друг на друга, и никому нет дела до того, как они устроены внутренним образом. Тут дело в том, что если объект не поддерживает сохранение в PropertyBag, т.е. не поддерживает определённый интерфейс, то упаковать его в PropertyBag не получится. Если он в этом случае содержит коллекции, то получается неверное знание о том, что коллекции не сохраняются.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как хитро сделать копию ADODB рекордсета

Сообщение ger_kar » 20.10.2014 (Пн) 21:06

Vi писал(а):Все коллекции похожи друг на друга, и никому нет дела до того, как они устроены внутренним образом. Тут дело в том, что если объект не поддерживает сохранение в PropertyBag, т.е. не поддерживает определённый интерфейс, то упаковать его в PropertyBag не получится.

И какой же интерфейс должен поддерживать объект, для упаковки его в PropertyBag? Обычный IDispath?
Бороться и искать, найти и перепрятать

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как хитро сделать копию ADODB рекордсета

Сообщение iGrok » 21.10.2014 (Вт) 3:43

ger_kar писал(а):И какой же интерфейс должен поддерживать объект, для упаковки его в PropertyBag? Обычный IDispath?

Производный от IPersist, выше же писали.
label:
cli
jmp label

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как хитро сделать копию ADODB рекордсета

Сообщение ger_kar » 21.10.2014 (Вт) 8:11

iGrok писал(а):Производный от IPersist, выше же писали.

Ну вообще то, то что написано выше про IPersist и его производные, из контекста написанного можно отнести по принадлежности к PropertyBag. По крайней мере я именно так и подумал, особенно учитывая, что есть интерфейс IPersistPropertyBag. Ну и в документации на ADODB в общем, и ADODB.Recordset в частности я нигде даже близко не встречал упоминания IPersist.
Однако после предыдущего сообщения решил проверить, и путем экспериментов выяснилось, что да рекордсет вполне себе поддерживает IPersistStream. Спасибо за советы.
Бороться и искать, найти и перепрятать

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Как хитро сделать копию ADODB рекордсета

Сообщение The trick » 21.10.2014 (Вт) 10:07

ger_kar, в PropertyBag можно сохранить только объекты поддерживающие IPersistStream и IPersistStreamInit.
UA6527P

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как хитро сделать копию ADODB рекордсета

Сообщение jangle » 22.10.2014 (Ср) 13:37

А базу данных можно сохранить в PropertyBag, чтобы использовать ее прямо от туда без сохранения на диск?

Код: Выделить всё
Set MDB_Database = p.ReadProperty("DataBase")

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как хитро сделать копию ADODB рекордсета

Сообщение ger_kar » 22.10.2014 (Ср) 15:11

jangle писал(а):А базу данных можно сохранить в PropertyBag, чтобы использовать ее прямо от туда без сохранения на диск?
Это чтобы на лету создавать базу и делать в ней всякие временные таблицы без обращения к диску? Наверное нельзя, ведь база данных это не объект.
The trick писал(а):ger_kar, в PropertyBag можно сохранить только объекты поддерживающие IPersistStream и IPersistStreamInit.
Вот если бы база отождествлялась с неким объектом (целиком) тогда можно было выяснить поддерживает ли этот объект интерфейсы IPersistStream и IPersistStreamInit. ADODB это даже не объект, а набор таковых, можно попробовать поэкспериментировать с ADOX.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.10.2014 (Ср) 15:21

Интересно, а зачем вообще база, если можно всё в памяти держать?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как хитро сделать копию ADODB рекордсета

Сообщение Хакер » 22.10.2014 (Ср) 15:57

Qwertiy писал(а):Интересно, а зачем вообще база, если можно всё в памяти держать?

База данных и так в памяти: только вопрос в какой (old_school_mode=on): ПЗУ или ОЗУ (old_school_mode=off). А делать, очевидно, ради реляционной модели и возможности доступа к данным с помощью SQL.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как хитро сделать копию ADODB рекордсета

Сообщение ger_kar » 22.10.2014 (Ср) 16:00

Qwertiy писал(а):Интересно, а зачем вообще база, если можно всё в памяти держать?
Ну например, ADO умеет делать запросы к базе данных и получать оттуда данные. Все замечательно, но иногда возникает необходимость выбрать некие данные из одного места (запросом с отбором, соединениями и прочими нюансами), что-либо сделать с этими данными, затем получить другой набор данных и потом получить некий третий набор на основе первых двух. Первые два набора (рекордсета) получить не представляет большого труда, но вот потом... Есть два рекордсета, но как к ним сделать соответствующий запрос? Единственный вариант - выгрузить их в создаваемые на диске временные таблицы, во временной же базе (а можно и не во временной) и сделать запрос уже к ним. Но такой финт с созданием таблиц, выгрузкой в них данных с последующим запросом получается достаточно громоздким и не очень то и производительным. Так вот хотелось бы (точнее так пока думается) создавать базу в памяти вместо диска и обращаться к ней, чтобы как то ускорить процесс, исключив диск из оборота. В принципе можно и без этого, но в любом случае требуется нечто, что можно использовать для выгрузки данных и последующему обращению как к базе с запросами. Надеюсь понятно изложил :)
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как хитро сделать копию ADODB рекордсета

Сообщение ger_kar » 22.10.2014 (Ср) 16:02

Да...
Писал, писал...
Хакер, сделал фактически тоже самое, но зато коротко и очень лаконично. Ну и на мой взгляд и понятнее тоже :)
Бороться и искать, найти и перепрятать


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 20

    TopList  
cron