powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Объеденение(сложение) рекордсетов.
25 сообщений из 39, страница 1 из 2
Объеденение(сложение) рекордсетов.
    #32941778
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Существует N баз данных, структура у всех одинаковая, таблицы одинаковые, данные в таблицах на разных серверах разные.

Cоздаю конекты, запросы к БД, получаю ответы в виде N рекордсетов.
Вопрос: как объеденить все рекордсеты в одни?

Пробовал по детски: set recordserT = recordset1+recordset2+...+recordsetN
Ошибка: Type mismatch, и больше нечего в голову не приходит.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32941853
LKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LKO
Гость
Azartкак объеденить все рекордсеты в одни?

если рекордсеты ADO, то можно создать рекордсет, с такими же полями, как и в N исходных (Вы говорите, что они по структуре одинаковые), затем слить в него данные из всех исходных рекордсетов...

При этом, конечно, будет потеряна возможность менять данные в БД через этот рекордсет, да и дорогая, и на мой взгляд бессмысленная операция...
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32941859
LKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LKO
Гость
Если не секрет, зачем?
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32941921
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторесли рекордсеты ADO, то можно создать рекордсет, с такими же полями, как и в N исходных
Да использую ADODB.
Как слить данные в один рекордсет??

Менять данные в БД не тербуется.
Это будет ДЛЛ, требуется их только оттуда считывать(БД много), объеденять и уже дальше сними будут другие работать.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32941946
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть подозрение, что рекордсеты нельзя объединять. Можно только через промежуточную таблицу
... или открыть рекордсет через запрос типа:
Код: plaintext
1.
2.
3.
SELECT *
FROM Items IN 'C:\1.mdb'
UNION ALL SELECT *
FROM Items IN 'C:\ 2 .mdb';
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32941984
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тоже думаю про то чтобы загнать всё во временную таблицу, а потом вернуть всё в один рекордсет. Если это конечно возможно.
Есть у кого линки про временные таблицы??

Код: plaintext
1.
2.
3.
4.
SELECT *
FROM Items IN 'C:\1.mdb'
UNION ALL SELECT *
FROM Items IN 'C:\2.mdb';

Не очень понял к чему это, сервера БД раскиданы далеко, они НЕ объеденены локалкой. Или ты предлагаешь делать так
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT *
FROM Items IN '\\88.90.13.14\1.mdb'
Where .....
UNION ALL SELECT *
FROM Items IN '\\194.67.57.25\2.mdb';
Where ....
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942031
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть один, не изящный, но работающий способ:
Создать синтетический рекордсет и в него "залить" все остальные.

В циклах конечно, по этому "не изящный".
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942042
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azart
Не очень понял к чему это, сервера БД раскиданы далеко, они НЕ объеденены локалкой. Или ты предлагаешь делать так
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT *
FROM Items IN '\\88.90.13.14\1.mdb'
Where .....
UNION ALL SELECT *
FROM Items IN '\\194.67.57.25\2.mdb';
Where ....

тяжкий случай однако.
запрос может накрыться медным тазом, если конекта к одной из баз не будет. однако, вдруг получится?
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942045
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Worobjoff: Как сделать синтетический рекордсет и в него "залить" все остальные.
Если можно пример кода или линк на чтонить похожее.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942059
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2marvan, даже очень возможно, что будет отсутствовать коннект к каким то серверам, но я не могу знать точный путь к mdb. К тому же задача стоит так чтобы, конект ко всем БД был одновременный, т.е. ещё надо многопоточность делать, а при машем методе это не возможно. :(
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942066
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   Set rsFlt = New ADODB.Recordset
   rsFlt.Fields.Append "Вкладка", adChar,  3 
   rsFlt.Fields.Append "Галка", adBoolean
   rsFlt.Fields.Append "Параметр", adVarChar,  20 
   rsFlt.Fields.Append "Условие", adInteger, , adFldIsNullable
   rsFlt.Fields.Append "Значение1", adDouble, , adFldIsNullable
   rsFlt.Fields.Append "Значение2", adDouble, , adFldIsNullable
   rsFlt.Open , , adOpenStatic, adLockBatchOptimistic
'Данные по Мехдобыче
   rsFlt.AddNew Array("Вкладка", "Условие", "Галка", "Параметр"), Array("НФРаб", Null, False, "Qж")
   rsFlt.AddNew Array("Вкладка", "Условие", "Галка", "Параметр"), Array("ДобРаб", Null, False, "Qн")
   rsFlt.AddNew Array("Вкладка", "Условие", "Галка", "Параметр"), Array("ДобРаб", Null, False, "%H2O")
   rsFlt.AddNew Array("Вкладка", "Условие", "Галка", "Параметр"), Array("ДобРаб", Null, False, "Dштуцера")
Здесь рекордсет заполняется "руками". Нужно доработать чтобы из другого рекордсета
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942085
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка: не надо обращать на строку
Код: plaintext
rsFlt.Fields.Append "Вкладка", adChar,  3 
Там 6 сейчас.
"Горячий" пример - сейчас с ним работаю.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942097
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До AddNew уже добрался, ну что то пока не как не получается заполнить его из другово рекордасета. Будем работать.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942132
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AzartДо AddNew уже добрался, ну что то пока не как не получается заполнить его из другово рекордасета. Будем работать.
Код: plaintext
1.
2.
3.
4.
5.
do until rs.Eof
 rsFlt.AddNew Array("Вкладка", "Условие", "Галка", "Параметр"), _
  Array(rs.Fields("Вкладка").Value, rs.Fields("Условие").Value, rs.Fields("Галка").Value, rs.Fields("Параметр").Value)
 rsflt.Update
 rs.Movenext
loop
Примерно так.
Замечание: лучше задать типы полей "руками", не копировать типы из исходника - меньше проблем будет
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942188
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем по строчкам копировать?
гораздо быстрее будет создать временную таблицу на диске и запросами на добавление сливать в неё данные из доступных баз, как предлагал LKO.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942199
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторrsFlt.AddNew Array("Вкладка", "Условие", "Галка", "Параметр")
Каждый раз возвращается рекордсет с разными полями. Или предполагается каждый раз доставать имена полей и уже потом руками их занасить.
Большая куча циклов получается.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942205
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как создать временную таблицу? :)
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942327
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вариант:
Один раз в базе данных создаём таблицу c определённой структутой (раз она во всех базах одинаковая)
1. Перед каждым обновлением выполняем sql запрос на удаление всех записей в этой таблице.
2. В цикле перечисляем все удалённые БД. Проверяем доступность базы. И если доступна, то INSERT INTO [локальная таблица] SELECT * FROM [удалённая таблица]
3. открываем recordset на основе локальной таблицы
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942372
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. компьютер на котором будет запускаться данная прога не будет базы данных.
2. на счёт таблицы. В каждой БД их определённое количество(одинаковое) и их структура одинаковая, НО их больше чем одна!!! и надо отрабатывать запросы на все таблици.

Правильно ли я предпологаю после выше сказанно, что выход, это создавать локально самому БД(файлик mdb), далее каждый раз создавать таблицу с определёными полями(имена можно вытащить из запроса, а вот тип незнаю как достать). а после этого
автор2. В цикле перечисляем все удалённые БД. Проверяем доступность базы. И если доступна, то INSERT INTO [локальная таблица] SELECT * FROM [удалённая таблица]
3. открываем recordset на основе локальной таблицы
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942821
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AzartВ каждой БД их определённое количество(одинаковое) и их структура одинаковая, НО их больше чем одна!!! и надо отрабатывать запросы на все таблици.

Если так, то зачем создавать БД. Проще иметь шаблон БД с пустыми таблицами. (mdb). Для каждого сеанса делать с него копию, и заполнять запросами из удалённых баз.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32943755
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гм. А не проще ли настроить репликацию на серверах? Сливать данные автоматом в одну базу, а потом уже показывать как вздумается?

Magnus
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944083
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсли так, то зачем создавать БД. Проще иметь шаблон БД с пустыми таблицами. (mdb). Для каждого сеанса делать с него копию, и заполнять запросами из удалённых баз. Интересный вариант, но запросто может быть не к одной таблицы, а к группе таблиц, которые в свою очередь связаны по ключу.

авторА не проще ли настроить репликацию на серверах? Нет не проще, всё уше описанное делается для уменьшения межсетевого трафика, а с репликацией он не уменьшается а увеличивается, хотя репликация снималабы все проблемы.

А можнали заполнить рекордсет из датагрида? если да, то можно поочередно заполнять один датагрид инфой из всех рекордсетов, а потом из него всё слить в один рекордсет.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944498
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тестировал синтетический рекордсет таким способом (самому надо):
Код: 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.
Private Sub btnСорт_Click()
   Dim t1 As Date, t2 As Date
   t1 = Now
   rsx.Sort = "ДАТА"
   t2 = Now
   lblСорт = Format((t2 - t1), "hh:mm:ss")
End Sub

Private Sub btnСтарт_Click()
   Dim t1 As Date, t2 As Date, t3 As Date
   If Not rsx Is Nothing Then Set rsx = Nothing
   Call Создать_rsx
   If rs.State = adStateOpen Then rs.Close
   Screen.MousePointer = ccHourglass
   DoEvents
   t1 = Now
   rs.Open
   t2 = Now
   Do Until rs.EOF
      rsx.AddNew 'Array("ИД", "ДАТА", "ТЕКСТ"), Array(rs.Fields(0), rs.Fields(1), rs.Fields(2))
      rsx.Fields( 0 ) = rs.Fields( 0 )
      rsx.Fields( 1 ) = rs.Fields( 1 )
      rsx.Fields( 2 ) = rs.Fields( 2 )
      rs.MoveNext
   Loop
   t3 = Now
   lblКопирование = Format((t2 - t1) *  60 , "hh:mm:ss")
   lblСчитывание = Format((t3 - t2) *  60 , "hh:mm:ss")
   Label2 = "Всего записей  " & rsx.RecordCount
   Screen.MousePointer = ccDefault
End Sub

Private Sub Form_Load()
   DE1.Conn1.Open
   Set rs = New ADODB.Recordset
   rs.Source = s
   rs.CursorLocation = adUseClient
   rs.ActiveConnection = Conn1
   rs.LockType = adLockReadOnly
   rs.CursorType = adOpenStatic
End Sub

Sub Создать_rsx()
   If Not rsx Is Nothing Then Set rsx = Nothing
   Set rsx = New ADODB.Recordset
   rsx.Fields.Append "ИД", adInteger
   rsx.Fields.Append "ДАТА", adDate
   rsx.Fields.Append "ТЕКСТ", adVarChar,  255 , adFldIsNullable
   rsx.Open
End Sub
Считывание всех 454 000 записей с оракла за 46 секунд
(запрос без сортировок и фильтров)
Копирование их в синтетический рекордсет за 4 секунды
Сортировка первый раз по одному полю за 10 секунд,
второй раз и все следующие за 0 секунд

Способ копирования записей в синтетический рекордсет на скорость не влияет.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944524
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что то я не догоняю как твой пример решит(поможет решить) мою проблему?
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944621
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AzartЧто то я не догоняю как твой пример решит(поможет решить) мою проблему?Здесь rs - только один источник. Для примера.
Поставь сколько надо этих rs-истчников с разных коннектов и "заливай" их последовательно во все тот же rsx.
Или условия задачи изменились? Azartструктура у всех одинаковая, таблицы одинаковые, данные в таблицах на разных серверах разные
Cоздаю конекты, запросы к БД, получаю ответы в виде N рекордсетов.
Вопрос: как объеденить все рекордсеты в один?
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Объеденение(сложение) рекордсетов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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