![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перенос данных из запроса в таблицу!! [D7, Access]
PhillipJFry © (2006-07-09 11:23:00)Подскажите, как сделать групповой перенос. Я работаю через ADO с базой данных Access. Компонент ADOQuery1 подключен к базе и выполняет запрос типа
SELECT FROM
WHERE
UNION
SELECT FROM
WHERE
В результате чего, ADOQuery1 выбирает из двух таблиц нужные данные.
Также у меня есть компонент TMemTableEh из пакета EHLib. Этот компонент держит все данные в памяти и работает как ни с чем несвязанный массив данных.
Вот такой вопрос, как добавить результат запроса ADOQuery1 в таблицу TMemTableEh не используя цикл??
PhillipJFry (2006-07-09 17:52:00) [1]Спасибо, теперь буду мучить :)
sniknik (2006-07-09 17:47:00) [2]> а как использовать ADODataSet1?
а как ты используеш ADOQuery1? это тоже самое (говорил же, ADOQuery, это слегка изуродованный ADODataSet), в нем должны быть данные для копирования. т.е. подключаеш (аналогично ADOQuery) к конекту, вставляеш запрос, выполняеш. и вот когда тум уже есть данные копируеш в другой "в памяти".
PhillipJFry (2006-07-09 15:28:00) [3]а как использовать ADODataSet1?
ругается на Коннект или строку конекта, а к чему его подключать?
sniknik (2006-07-09 12:52:00) [4]компонент однозначно ADODataSet, не в принципе можно и другой (тот же клиентский) но зачем? раз уже используем ADO и но позволяет...
> и добавить данные в ту же таблицу memTable
а вот добавление без цикла вообще нигде не сделать, если первоначальный результат можно копией рекордсета через стрим сделать, то вот добавление не получится, структура будет мешать. если в какижто компанентах и есть функционал на добавление то внутри все одно цикл.
но не пойму чего страшного такого в простом цикле? (двойной, один проход по записям, внутри по полям) элементарно делается.
вот копия не совсем элементарно... поэтому пример
uses ADOInt, ComObj;
function CopyRecordSet(RecordSet: _RecordSet): _RecordSet;
var adoStream: OleVariant;
begin
adoStream:= CreateOleObject('ADODB.Stream');
Variant(RecordSet).Save(adoStream, adPersistADTG);
Result:= CreateOleObject('ADODB.RecordSet') as _RecordSet;
Result.CursorLocation:= adUseClient;
Result.Open(adoStream, EmptyParam, adOpenStatic, adLockBatchOptimistic, Integer(adOptionUnspecified));
adoStream:= UnAssigned;
end;
использовать
ADODataSet2.Recordset:= CopyRecordSet(ADODataSet1.Recordset);
PhillipJFry (09.07.06 12:21) [5]
это у тебя уже ошибка в логике, которую ты даже не пытаешся исправить а закрываеш програмированием. но не боись оно еще вылезет, не здесь так в другом месте.
подзапросом не пробовал к примеру делать? так чтобы "анализ" был непосредственно в нем, а запрос выдавал все. (хотя подозреваю счас выяснится что и структура базы несколько "нестандарная"... ;)
PhillipJFry (2006-07-09 12:21:00) [5]запрос
SELECT FROM
WHERE
UNION
SELECT FROM
WHERE
содержит параметры. Значения которых заранее не известны.Они зависят от самого результата запроса. Вот я и хочу, выполнить запрос, затем перекинуть его в некую таблищц memTable, затем в ней проанализировать данные и на основе их опять выполнить запрос и т.д. А затем эту совокупность данных что получатся в результате запросов в таблице memTable , уже использовать в другох целях.
PhillipJFry (2006-07-09 12:14:00) [6]мне нужно следующее:
1. выполнить запрос
SELECT FROM
WHERE
UNION
SELECT FROM
WHERE
и скинуть его результат в некую таблицу memTable
2.опять выполнить запрос
SELECT FROM
WHERE
UNION
SELECT FROM
WHERE
и добавить данные в ту же таблицу memTable
...
таблица memTable это таблица в памяти , которая не связана не с одной таблицей на жёстком диске.
Подскажите, как реализовать такой механизм? и какой компонент использовать для формирования memTable (таблицы в памяти)?
sniknik (2006-07-09 12:06:00) [7]ClientDataSet хранит данные в памяти, ADODataSet хранит данные в памяти (ADOQuery вариация ADODataSet немного "покоцаная"), при выполнении запроса даже делать ничего не нужно данные в память закачиваются, а не с диска показываются (при клиентском курсоре, как по умолчанию стоит)...
ну и что? нет, это не смысл, это отмазка.
т.е. ты береш один компонент у которого данные уже в памяти и спрашиваеш, "как перекачать в другой", потому, что там данные в памяти... бред.
PhillipJFry (2006-07-09 11:56:00) [8]Смысл в том, что мне нужно создать таблицу, которая хранит данные в памяти, а не в конкретной таблицы на диске. TMemTableEh и создает такую таблицу в памяти.
sniknik (2006-07-09 11:36:00) [9]не получится... если конечно в твоем TMemTableEh уже не встроена эта реализация, как например в стандартном ClientDataSet (подключить через провайдер данных и просто Open).
вообще непонятное желание, зачем чтото кудато переносить? тем более в нестандартный компонент, при том что у самого ADO рекордсеты это такиеже "таблици в памяти"... и вобщемто и копию в нем в другой ADODataSet не сложно сделать, но смысл?