|
|
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Добрый день! Существует N баз данных, структура у всех одинаковая, таблицы одинаковые, данные в таблицах на разных серверах разные. Cоздаю конекты, запросы к БД, получаю ответы в виде N рекордсетов. Вопрос: как объеденить все рекордсеты в одни? Пробовал по детски: set recordserT = recordset1+recordset2+...+recordsetN Ошибка: Type mismatch, и больше нечего в голову не приходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 16:30:46 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Azartкак объеденить все рекордсеты в одни? если рекордсеты ADO, то можно создать рекордсет, с такими же полями, как и в N исходных (Вы говорите, что они по структуре одинаковые), затем слить в него данные из всех исходных рекордсетов... При этом, конечно, будет потеряна возможность менять данные в БД через этот рекордсет, да и дорогая, и на мой взгляд бессмысленная операция... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 16:53:50 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Если не секрет, зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 16:55:39 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
авторесли рекордсеты ADO, то можно создать рекордсет, с такими же полями, как и в N исходных Да использую ADODB. Как слить данные в один рекордсет?? Менять данные в БД не тербуется. Это будет ДЛЛ, требуется их только оттуда считывать(БД много), объеденять и уже дальше сними будут другие работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:14:58 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Есть подозрение, что рекордсеты нельзя объединять. Можно только через промежуточную таблицу ... или открыть рекордсет через запрос типа: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:18:52 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Вот тоже думаю про то чтобы загнать всё во временную таблицу, а потом вернуть всё в один рекордсет. Если это конечно возможно. Есть у кого линки про временные таблицы?? Код: plaintext 1. 2. 3. 4. Не очень понял к чему это, сервера БД раскиданы далеко, они НЕ объеденены локалкой. Или ты предлагаешь делать так Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:28:21 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Есть один, не изящный, но работающий способ: Создать синтетический рекордсет и в него "залить" все остальные. В циклах конечно, по этому "не изящный". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:40:40 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Azart Не очень понял к чему это, сервера БД раскиданы далеко, они НЕ объеденены локалкой. Или ты предлагаешь делать так Код: plaintext 1. 2. 3. 4. 5. 6. тяжкий случай однако. запрос может накрыться медным тазом, если конекта к одной из баз не будет. однако, вдруг получится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:42:19 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
2Worobjoff: Как сделать синтетический рекордсет и в него "залить" все остальные. Если можно пример кода или линк на чтонить похожее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:42:52 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
2marvan, даже очень возможно, что будет отсутствовать коннект к каким то серверам, но я не могу знать точный путь к mdb. К тому же задача стоит так чтобы, конект ко всем БД был одновременный, т.е. ещё надо многопоточность делать, а при машем методе это не возможно. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:45:57 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:46:43 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Поправка: не надо обращать на строку Код: plaintext "Горячий" пример - сейчас с ним работаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:50:36 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
До AddNew уже добрался, ну что то пока не как не получается заполнить его из другово рекордасета. Будем работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:53:39 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
AzartДо AddNew уже добрался, ну что то пока не как не получается заполнить его из другово рекордасета. Будем работать. Код: plaintext 1. 2. 3. 4. 5. Замечание: лучше задать типы полей "руками", не копировать типы из исходника - меньше проблем будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 18:05:17 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
а зачем по строчкам копировать? гораздо быстрее будет создать временную таблицу на диске и запросами на добавление сливать в неё данные из доступных баз, как предлагал LKO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 18:24:24 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
авторrsFlt.AddNew Array("Вкладка", "Условие", "Галка", "Параметр") Каждый раз возвращается рекордсет с разными полями. Или предполагается каждый раз доставать имена полей и уже потом руками их занасить. Большая куча циклов получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 18:27:49 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
как создать временную таблицу? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 18:28:53 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
как вариант: Один раз в базе данных создаём таблицу c определённой структутой (раз она во всех базах одинаковая) 1. Перед каждым обновлением выполняем sql запрос на удаление всех записей в этой таблице. 2. В цикле перечисляем все удалённые БД. Проверяем доступность базы. И если доступна, то INSERT INTO [локальная таблица] SELECT * FROM [удалённая таблица] 3. открываем recordset на основе локальной таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 19:40:07 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
1. компьютер на котором будет запускаться данная прога не будет базы данных. 2. на счёт таблицы. В каждой БД их определённое количество(одинаковое) и их структура одинаковая, НО их больше чем одна!!! и надо отрабатывать запросы на все таблици. Правильно ли я предпологаю после выше сказанно, что выход, это создавать локально самому БД(файлик mdb), далее каждый раз создавать таблицу с определёными полями(имена можно вытащить из запроса, а вот тип незнаю как достать). а после этого автор2. В цикле перечисляем все удалённые БД. Проверяем доступность базы. И если доступна, то INSERT INTO [локальная таблица] SELECT * FROM [удалённая таблица] 3. открываем recordset на основе локальной таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 20:13:11 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
AzartВ каждой БД их определённое количество(одинаковое) и их структура одинаковая, НО их больше чем одна!!! и надо отрабатывать запросы на все таблици. Если так, то зачем создавать БД. Проще иметь шаблон БД с пустыми таблицами. (mdb). Для каждого сеанса делать с него копию, и заполнять запросами из удалённых баз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 09:45:06 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Гм. А не проще ли настроить репликацию на серверах? Сливать данные автоматом в одну базу, а потом уже показывать как вздумается? Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 14:23:25 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
авторЕсли так, то зачем создавать БД. Проще иметь шаблон БД с пустыми таблицами. (mdb). Для каждого сеанса делать с него копию, и заполнять запросами из удалённых баз. Интересный вариант, но запросто может быть не к одной таблицы, а к группе таблиц, которые в свою очередь связаны по ключу. авторА не проще ли настроить репликацию на серверах? Нет не проще, всё уше описанное делается для уменьшения межсетевого трафика, а с репликацией он не уменьшается а увеличивается, хотя репликация снималабы все проблемы. А можнали заполнить рекордсет из датагрида? если да, то можно поочередно заполнять один датагрид инфой из всех рекордсетов, а потом из него всё слить в один рекордсет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 15:46:22 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Тестировал синтетический рекордсет таким способом (самому надо): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. (запрос без сортировок и фильтров) Копирование их в синтетический рекордсет за 4 секунды Сортировка первый раз по одному полю за 10 секунд, второй раз и все следующие за 0 секунд Способ копирования записей в синтетический рекордсет на скорость не влияет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 17:17:06 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Что то я не догоняю как твой пример решит(поможет решить) мою проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 17:24:57 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
AzartЧто то я не догоняю как твой пример решит(поможет решить) мою проблему?Здесь rs - только один источник. Для примера. Поставь сколько надо этих rs-истчников с разных коннектов и "заливай" их последовательно во все тот же rsx. Или условия задачи изменились? Azartструктура у всех одинаковая, таблицы одинаковые, данные в таблицах на разных серверах разные Cоздаю конекты, запросы к БД, получаю ответы в виде N рекордсетов. Вопрос: как объеденить все рекордсеты в один? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 17:50:51 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
господа, похоже наш автор имеет ввиду немного не то вот что он хочет, как я понял: Код: plaintext и тд и тп ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 18:02:22 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
ТЗ тоже, просто я не очень силён в программирование, точнее только учусь, отсюда глупые вопросы. Я так понял у меня должно получится что то такое автор Dim rsSymma as ADODB.Recordset Dim rs1 as ADODB.Recordset Dim rs2 as ADODB.Recordset Dim rsN as ADODB.Recordset Do Until rs1.EOF rsSymma.AddNew 'Array rsSymma.Fields(0) = rs1.Fields(0) rsSymma.Fields(1) = rs1.Fields(1) rsSymma.Fields(Т) = rs1.Fields(Т) rs1.MoveNext Loop Do Until rs2.EOF rsSymma.AddNew 'Array rsSymma.Fields(0) = rs2.Fields(0) rsSymma.Fields(1) = rs2.Fields(1) rsSymma.Fields(Т) = rs2.Fields(Т) rs2.MoveNext Loop Do Until rsN.EOF rsSymma.AddNew 'Array rsSymma.Fields(0) = rsN.Fields(0) rsSymma.Fields(1) = rsN.Fields(1) rsSymma.Fields(Т) = rsN.Fields(Т) rsN.MoveNext Loop И в начале цикла делать "Т = rs1.Fields.Count - 1", чтоб узнать количество полей, для всех оно будет одинаково, так что можно будет делать только 1 раз. Поправьте меня, если я гдето опять ошибся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 18:08:08 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
что за бредовый код - не вижу в нем никакого смысла. объясни нормально как у тебя должны данные отображаться и в каком виде (нарисуй свой бумажный отчет сначала), а потом уже можно решение предлагать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 18:13:06 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Konst_One: Т.е. возможно следущее??? Код: plaintext Терзают сомнения, что инфа из одинаковых полей разных рекордсетов будет добавляться в виде новых полей, а не в виде новых записей в эти же поля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 18:14:13 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
нет так нельзя. ответь на мой первый вопрос: какова цель твоей программы, что она должна сделать/отобразить/распечатать/и тп? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 18:23:34 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Azart автор Dim rsSymma as ADODB.Recordset Dim rs1 as ADODB.Recordset Dim rs2 as ADODB.Recordset Dim rsN as ADODB.Recordset . . . И в начале цикла делать "Т = rs1.Fields.Count - 1", чтоб узнать количество полей, для всех оно будет одинаково, так что можно будет делать только 1 раз.1. Вы правильно меня поняли. 2. А что количество полей заранее не известно? Или оно может со временем меняться? Наверно сначала надо сделать задачу на фиксированном наборе полей, а потом думать как придать программе универсальность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 18:24:58 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Цель: объеденить в один рекордсет данные из N рекордсетов. А точнее есть ДЛЛ в ней Код: plaintext автор2. А что количество полей заранее не известно? Или оно может со временем меняться? В БД много таблиц и у всех количество полей разное, поэтому заранее количество полей не известно, и неизвестно какая выборка и из каких таблиц понадобится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 18:33:16 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
линкуй свои запросы из разных баз в свою акцессную базу , а потом натравливай union запрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 18:38:59 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Локальной базы нет и создавать её не желательно(Остальные БД сиквеловские). Может есть способ записать последовательно данные из каждого рекордсета к примеру в Датагрид, а потом из Датагрида запихнуть всё в один рекордсет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 18:43:38 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
AzartВ БД много таблиц и у всех количество полей разное, поэтому заранее количество полей не известно, и неизвестно какая выборка и из каких таблиц понадобится.Предлагаю: 1. Решить задачу для одного, фиксированного запроса. 2. Написать универсальную процедуру для создания этого синтетического рекордсета. Главое здесь правильно задать типы полей (полезно ограничить их разнообразие чтобы избежать подводных камней). Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 19:03:12 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Worobjoff Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 19:10:28 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
авторГлавое здесь правильно задать типы полей Это сложно, т.к. я не могу знать какие поля будут требоваться в запросе. Чтоб это обойти создаю запрос к любой из базы данных с запросов тогоже вида что мне пришёл, но с условиями чтоб получить нуль записей, тем самым получаю рекордсет с полями но без записей, а далее начинаю заполнять как ты говорил. Промучился целый день и вот на что накнулся (вылетает на AddNew): Cannot insert the value NULL into column "XXX", table "YYY.dbo.ZZZ"; column does not allow nulls. Insert fails. а процедурку вот какую придумал: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2005, 17:55:36 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
Вот работающая процедура, которая создаст синтетический рекордсет, и зальет в него данные из открытого другого рекордсета. (rs_in - источник данныых и образец полей, rs_out - рекордсет уровня модуля (формы), используемый как синтетический) Для копирования данных из остальных рекордсетов, надо еще одну процедуру написать используя то, что после строчки "'Начало копирования данных:" Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2005, 11:06:01 |
|
||
|
Объеденение(сложение) рекордсетов.
|
|||
|---|---|---|---|
|
#18+
AzartЧтоб это обойти создаю запрос к любой из базы данных с запросов тогоже вида что мне пришёл, но с условиями чтоб получить нуль записей, тем самым получаю рекордсет с полями но без записей, а далее начинаю заполнять как ты говорил. Промучился целый день и вот на что накнулся (вылетает на AddNew): Cannot insert the value NULL into column "XXX", table "YYY.dbo.ZZZ"; column does not allow nulls. Insert fails. Если запрос, на основе которого создан рекордсет - не обновляемый, не получится это сделать по сл. причине: Рекордсет берет в себя констрейнты с источника данных. И не только NotNull. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2005, 11:13:04 |
|
||
|
|

start [/forum/topic.php?all=1&fid=60&tid=2168138]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
53ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 380ms |

| 0 / 0 |
