[Delphi] [ADO] Как явно скопировать Recordset?

kill-still

Что необходимо сделать - есть рекордсет, его надо скопировать в другой.
 
   _RecordsetDisp = dispinterface
.......
function Clone(LockType: LockTypeEnum)
......
end

делает это неявно. т.е. присваивает только ссылку на объект. и изменения в "скопированном" датасене приводят к изменениям в начальном.
после поисков в инете нашёл следующее:
 
Contrary to popular belief, Recordset.Clone doesn't actually clone the recordset. It doesn't actually create a new object in memory - it simply returns a reference to the original recordset with the option of making the reference read-only. To verify this claim, simply delete a record from the cloned recordset and you will see that the .RecordCount on the original recordset also decreases.
So how do you actually make a true clone of the recordset with no dependencies or dangling references? One way is to save the recordset to file via the .Save method and then read it into another recordset. However, this method is very costly and time-consuming because ADO has to write the entire recordset structure, including field types and every property and every piece of data to disk. The proper answer is in the rarely used ADODB.Stream object. It turns out that you can save the entire recordset to this object (which is in memory) and then restore to another recordset. Check out the code below.

источник:
http://www.vbrad.com/article.aspx?id=12
но у рекордсета не нашёл ни метода сохранения в стрим, ни загрузки из стрима.
подскажите пожалуйста, как это сделать по-нормальному?
(не копировать же его построчно?)

123anna

Если данных из рекордсета выходит настолько мало, что ты осмеливаешься их сохранить в поток, то можно написать класс-обертку вокруг рекордсета, который будет буферизовывать в себе уже прочитанные строчки. Иметь один экземпляр этого класса (для каждого рекордсет) и дергать из разных мест программы.
Или вообще переписать программу так, чтобы рекордсет обрабатывался сразу и за один проход. Потому что твое желание клонировать противоестественно

kill-still

Моё желание вполне естественно - мне надо открыть в модальном окне небольшую таблицу с аттрибутами, отредактировать их, и либо нажать отмена, либо ок, и тогда изменения запишутся.
Пока что сделал процедурку, которая просто построчно перегоняет один рекордсет в другой, видимо так и останется. Не очень красиво, зато работает 100%. Излишний перфекционизм тоже нехорошо.

stm5643616

А зачем тебе надо копировать рекордсет в другой рекордсет?
Можно просто повесить два датасета на одну кверю.
Или две одинаковых квери сделай.
Расскажи более широкую постановку задачи - что хочешь сделать?

Andbar

мне надо открыть в модальном окне небольшую таблицу с аттрибутами, отредактировать их, и либо нажать отмена, либо ок, и тогда изменения запишутся
Если не ошибаюсь, в датасетах Delphi, которые предоставляют возможность кеширования изменений (с возможностью отмены) это делается так: создаётся список изменившихся строк с обновлениями, который потом флушится. Предполагается, что размер всех данных датасета гораздо больше среднего объёма изменений.
Оставить комментарий
Имя или ник:
Комментарий: