powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Совместить результаты двух ADODB.Recordset
22 сообщений из 22, страница 1 из 1
Совместить результаты двух ADODB.Recordset
    #38524944
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

Имею один RecordSet к сетевому источнику
Имею второй RecordSet к локальному источнику

Необходимо на стороне клента совместить два RecordSet (структура и типы полей одинакова)

Подсажите как это сделать ?
Буду признателен за код
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38524962
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что в вашем понимании "совместить"?
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38524986
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Результат серверного RecordSet-а
F1 F2
---------
A1 A2
N1 N2
R1 R1


Результат локального RecordSet-а
F1 F2
---------
T1 T2
K1 K2
L1 L1

В результате должен получить RecordSet

F1 F2
---------
A1 A2
N1 N2
R1 R1
T1 T2
K1 K2
L1 L1

Можно реализовать через ВРЕМЕННОЙ RecordSet и добавить в него два других

Хотелось бы реализовать ОТКЛЮЧИВ (один из уже выполненных) от источника
и добавив к нему другой
Или предложите Ваш Вариант, может біть возможно одной командой совместить два обьекта
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38524991
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Клиент на чём написан?
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38525016
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HOME_XМожно реализовать через ВРЕМЕННОЙ RecordSet и добавить в него два других
не уверен, но, имхо, через выгрузку/загрузку в DOMDocument - должно быть быстрее,
чем просто заполнять в цикле

в любом случае, такой код будет универсальный для любых рекордсетов, - можно сделать функцию, которая будет принимать несколько рекордсетов, и возвращать один объединённый

в xmlDoc1 - стоит "грузить" больший рекордсет
Код: vbnet
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.
Sub test()
    Dim rs0 As ADODB.Recordset
    Dim rs1 As ADODB.Recordset
    Dim rs2 As ADODB.Recordset
    Dim xmlDoc1 As MSXML2.DOMDocument
    Dim xmlDoc2 As MSXML2.DOMDocument
    Dim xmlNode As MSXML2.IXMLDOMNode
    Dim xmlNode1 As MSXML2.IXMLDOMNode
    Dim xmlNode2 As MSXML2.IXMLDOMNode
    '
    Set rs0 = New ADODB.Recordset
    Set rs1 = New ADODB.Recordset
    Set rs2 = New ADODB.Recordset
    Set xmlDoc1 = New MSXML2.DOMDocument
    Set xmlDoc2 = New MSXML2.DOMDocument
    
    rs1.Open "select 1 as f1, 3 as f2", CurrentProject.Connection
    rs2.Open "select 2 as f1, 4 as f2", CurrentProject.Connection
    
    '   ********************************************
    rs1.Save xmlDoc1, adPersistXML
    rs2.Save xmlDoc2, adPersistXML
    
    Set xmlNode1 = xmlDoc1.getElementsByTagName("rs:data").Item(0)
    Set xmlNode2 = xmlDoc2.getElementsByTagName("rs:data").Item(0)
    
    For Each xmlNode In xmlNode2.childNodes
        xmlNode1.appendChild xmlNode
    Next
    '
    rs0.Open xmlDoc1
    '   ********************************************
    
    With rs0
        .MoveFirst
        Do While Not .EOF
            Debug.Print .Fields(0), .Fields(1)
            .MoveNext
        Loop
    End With
    '
    rs0.Close: Set rs0 = Nothing
    rs1.Close: Set rs1 = Nothing
    rs2.Close: Set rs2 = Nothing
    Set xmlDoc1 = Nothing
    Set xmlDoc2 = Nothing
End Sub


АДО должно быть версии 2.5 и выше
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38525027
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HOME_XИмею один RecordSet к сетевому источнику
Имею второй RecordSet к локальному источнику
даа, и кстати, а почему нельзя было сделать сразу один гетерогенный UNION-запрос к обоим источникам ?
нередактируемый, правда, будет ...
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38525116
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112HOME_XИмею один RecordSet к сетевому источнику
Имею второй RecordSet к локальному источнику
даа, и кстати, а почему нельзя было сделать сразу один гетерогенный UNION-запрос к обоим источникам ?
нередактируемый, правда, будет ...

Покажите пожалуйста примером
1. запрос к Oracle
2. запрос к Excel
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38525117
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTMКлиент на чём написан?
Клиент это ODBC драйвер под Excel страницу
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38525120
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112можно сделать функцию, которая будет принимать несколько рекордсетов


Где-то так и хочу
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38525123
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HOME_Xqwerty112пропущено...

даа, и кстати, а почему нельзя было сделать сразу один гетерогенный UNION-запрос к обоим источникам ?
нередактируемый, правда, будет ...

Покажите пожалуйста примером
1. запрос к Oracle
2. запрос к Excel

что-то типа такого
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
cn.Open "строка подключения к Экселю с Jet или ACE провайдером"
strSQL = _ 
"select f1, f2, .... from ExcelTab " & _
"union all " & _
"select f1, f2, .... from OracleTab in ''[ODBC;Driver={Microsoft ODBC for Oracle};Server=myServerAddress;Uid=myUsername;Pwd=myPassword;]"

rs.Open strSQL, cn


навсякей http://www.connectionstrings.com/microsoft-odbc-for-oracle/
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38525127
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XХотелось бы реализовать ОТКЛЮЧИВ (один из уже выполненных) от источника и добавив к нему другойКак вариант - сначала, используя оракловский провайдер, сделать запрос и выгрузить рекордсет на лист; а затем уже, используя экзелевский провайдер, сделать запрос внутри книги к двум таблицам. Конечно, имеет смысл только в том случае, если результат, подтягиваемый из оракловской базы, не слишком объёмен...
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38525141
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112,

Понял - типа
Provider=Microsoft.Jet.OLEDB.4.0;Data Source={FULL}.xls;Extended Properties="Excel 8.0;HDR=YES;IMEX=1"
select * from [Excel 8.0;HDR=YES;IMEX=1;DATABASE={?}.xls].[PRODUCT]

Сейчас буду пробовать
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38525314
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HOME_Xqwerty112можно сделать функцию, которая будет принимать несколько рекордсетов


Где-то так и хочу
нуу, я вот такое что-то имел в виду
Код: vbnet
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.
Function UnionRS(ParamArray rs()) As ADODB.Recordset
    Dim i As Long
    Dim result As ADODB.Recordset
    Dim xmlDoc As MSXML2.DOMDocument
    Dim xmlDocTmp As MSXML2.DOMDocument
    Dim xmlNode As MSXML2.IXMLDOMNode
    Dim xmlNodeRSData As MSXML2.IXMLDOMNode
    '
    If UBound(rs) < 0 Then
        MsgBox "Бяда !", vbCritical
        Exit Function
    End If
    '
    Set xmlDoc = New MSXML2.DOMDocument
    Set xmlDocTmp = New MSXML2.DOMDocument

    rs(0).Save xmlDoc, adPersistXML
    Set xmlNodeRSData = xmlDoc.getElementsByTagName("rs:data").Item(0)
    '
    For i = 1 To UBound(rs)
        rs(i).Save xmlDocTmp, adPersistXML
        For Each xmlNode In xmlDocTmp.getElementsByTagName("rs:data").Item(0).childNodes
            xmlNodeRSData.appendChild xmlNode
        Next
    Next i
    '
    Set result = New ADODB.Recordset
    result.Open xmlDoc
    '
    Set UnionRS = result
    '
    Set xmlDoc = Nothing
    Set xmlDocTmp = Nothing
End Function



Код: vbnet
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.
Sub test()
    Dim rs0 As ADODB.Recordset
    Dim rs1 As ADODB.Recordset
    Dim rs2 As ADODB.Recordset
    Dim rs3 As ADODB.Recordset
    Dim rs4 As ADODB.Recordset
    Dim rs5 As ADODB.Recordset
    '
    Set rs1 = New ADODB.Recordset
    Set rs2 = New ADODB.Recordset
    Set rs3 = New ADODB.Recordset
    Set rs4 = New ADODB.Recordset
    Set rs5 = New ADODB.Recordset
    
    rs1.Open "select 1 as f1, 2 as f2", CurrentProject.Connection
    rs2.Open "select 3 as f1, 4 as f2", CurrentProject.Connection
    rs3.Open "select 5 as f1, 6 as f2", CurrentProject.Connection
    rs4.Open "select 7 as f1, 8 as f2", CurrentProject.Connection
    rs5.Open "select 9 as f1, 10 as f2", CurrentProject.Connection
    
    Set rs0 = UnionRS(rs1, rs2, rs3, rs4, rs5)
    '
    With rs0
        .MoveFirst
        Do While Not .EOF
            Debug.Print .Fields(0), .Fields(1)
            .MoveNext
        Loop
    End With
    '
    rs0.Close: Set rs0 = Nothing
    rs1.Close: Set rs1 = Nothing
    rs2.Close: Set rs2 = Nothing
    rs3.Close: Set rs3 = Nothing
    rs4.Close: Set rs4 = Nothing
    rs5.Close: Set rs5 = Nothing
    
End Sub


Код: vbnet
1.
2.
3.
4.
5.
6.
test
 1             2 
 3             4 
 5             6 
 7             8 
 9             10 


...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38525719
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112"select f1, f2, .... from OracleTab in ''[ODBC;Driver={Microsoft ODBC for Oracle};Server=myServerAddress;Uid=myUsername;Pwd=myPassword;]"


Извините не могу воспроизвести именно такой синтаксис [ODBC;Driver
т.е. ссылку на ODBC

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub CommandButton1_Click()
   Dim rsA As New ADODB.Recordset
   rsA.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Temp\RR10.xls;Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"""
   'rsA.Source = "select F1 from [Excel 8.0;HDR=YES;IMEX=1;DATABASE=C:\Temp\RR10.xls].[RR]"
   rsA.Source = "select F1 from [RR] in '[ODBC;Driver={Driver do Microsoft Excel(*.xls)};DBQ=C:\Temp\RR10.xls]'"
   rsA.Open
   Do While Not rsA.EOF
     MsgBox rsA.Fields("F1")
     rsA.MoveNext
   Loop
   rsA.Close
   Set rsA = Nothing
End Sub
 



Подскажите пожалуйста в чем причина
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38525825
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем вам второй раз указывать провайдера? У вас же источник уже подключен, вплоть до файла.
Сделайте что-то вроде этого:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
   Dim cnn, rst
   Set cnn = CreateObject("ADODB.Connection")
   cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\Temp\RR10.xls';Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"""
   Set rst = CreateObject("ADODB.Recordset")
   rst.CursorLocation = 3 ' adUseClient
   cSQL = "select F1 from [RR$]"
   rst.Open cSQL, cnn


Кстати, если в коннекшене указать всё то же самое, но с ;Data Source=''; , а в SELECT'е - полные пути к книгам, то можно извлечь данные из нескольких файлов...
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38525850
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot AndreTM]
А зачем вам второй раз указывать провайдера?
[/src]

В продуктиве у меня будет два РАЗНЫХ драйвера один Excel второй Oracle
но так как сходу такой финт неудался, (подумал что ошибаюсь с коннектString Oracle)
изображил для примера такой доступ - тоже не получилось

Приведите пример пожалуйста, такое ВООБЩЕ возможно

rsA.Source = "select F1 from [RR] in '[ODBC;Driver={Driver do Microsoft Excel(*.xls)};DBQ=C:\Temp\RR10.xls]'"
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38525897
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HOME_Xqwerty112"select f1, f2, .... from OracleTab in ''[ODBC;Driver={Microsoft ODBC for Oracle};Server=myServerAddress;Uid=myUsername;Pwd=myPassword;]"


Извините не могу воспроизвести именно такой синтаксис [ODBC;Driver
т.е. ссылку на ODBC

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub CommandButton1_Click()
   Dim rsA As New ADODB.Recordset
   rsA.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Temp\RR10.xls;Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"""
   'rsA.Source = "select F1 from [Excel 8.0;HDR=YES;IMEX=1;DATABASE=C:\Temp\RR10.xls].[RR]"
   rsA.Source = "select F1 from [RR] in '[ODBC;Driver={Driver do Microsoft Excel(*.xls)};DBQ=C:\Temp\RR10.xls]'"
   rsA.Open
   Do While Not rsA.EOF
     MsgBox rsA.Fields("F1")
     rsA.MoveNext
   Loop
   rsA.Close
   Set rsA = Nothing
End Sub
 



Подскажите пожалуйста в чем причина
причина в одинарных кавычках
это НЕ у меня "рука дрогнула", это такой синтаксис
если НЕ файловый, а ОДБЦ источник, то идёт пара апострофов, а потом в прямых скобках - строка подключения.
Код: sql
1.
select f1, f2, .... from OracleTab in ''[ODBC;Driver={Microsoft ODBC for Oracle};Server=myServerAddress;Uid=myUsername;Pwd=myPassword;]


для файловых источников, в этих апострофах указываеться путь

а конкретно в цитируемом посте - ерунда написанна
не нужно в уже имеющемся коннекте к файлу C:\Temp\RR10.xls , дополнительно указывать одбц подключение к ЭТОМУ ЖЕ ФАЙЛУ

такой синтаксис нужен тогда, когда есть подключение (Jet или ACE) к фалу Экселя/Акцесса/даа хоть к тхт-файлу
и нужно получить данные из другого источника (Оракле, МС СКЛ и т.д.)

внимательно посмотрите пример тут - 15411143
тут, скорее, может возникнуть проблема с параметрами подкл.к Ораклу, так как там параметров "до чёртиков"
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38525959
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112,

Спасибо уважаемый Qwerty112
Все получилось - делал так.

Код: vbnet
1.
2.
   rsA.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\TEMP\RR10.xls;Extended Properties=""Excel 8.0"""
   rsA.Source = "select F1 from [Excel 8.0;HDR=YES;IMEX=1;DATABASE=C:\Temp\RR10.xls].[RR] union all select DESCR from [ODBC;Driver={Oracle in OraClient11g_home1};UID=LOGIN;PWD=PASSWORD;DBQ=XXXX.XX;Server=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xx.xx.x.xx)(PORT = 1521))(CONNECT_DATA=(SERVER=DEDICATED)(SID = RCC)))].[XXX.TABLE]"



Результат один RecordSet.

Спасибо
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38525986
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

А как реально выполняеться такие запросы
Имею в виду можно ли сказать

Это синтаксис MJet
select F1 from [Excel 8.0;HDR=YES;IMEX=1;DATABASE=C:\Temp\RR10.xls].[RR]


Это синтаксис Oracle
select DESCR from .......


rsA.Source = "select F1 from [Excel 8.0;HDR=YES;IMEX=1;DATABASE=C:\Temp\RR10.xls].[RR] union all select DESCR from [ODBC;Driver={Oracle in OraClient11g_home1};UID=LOGIN;PWD=PASSWORD;DBQ=XXXX.XX;Server=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xx.xx.x.xx)(PORT = 1521))(CONNECT_DATA=(SERVER=DEDICATED)(SID = RCC)))].[XXX.TABLE]"


Или господин MJet - сам интерпретирует запросы
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38526035
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Т.е. мне необходимо выполнить СИНТАКСИС Oracle, а не MJet !!!!
rsA.Source = "select F1 from [Excel 8.0;HDR=YES;IMEX=1;DATABASE=C:\Temp\RR10.xls].[RR] union all select DESCR as F1 from [ODBC; SQLTEXT=select DESCR from BRANCH+навороті Oracle ;Driver={Oracle in OraClient11g_home1};UID=zz;PWD=zz;DBQ=zz.zz;Server=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=zz.zz.z.zz)(PORT = zzzz))(CONNECT_DATA=(SERVER=DEDICATED)(SID = zzz)))].[ SQLTEXT ]"
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38526084
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ODBC/ADO/DAO имеют собственный синтаксис для каждого из провайдеров, так что все возможности сиснтаксиса Оракл вы все равно не получите. Я вот точно не знаю, - если используется несколько разных дайверов/провайдеров - то какой синтаксис приемлем? Первого провайдера? Последнего? Только "общий" для всех?
Поэтому я и посоветовал выше - сначала скачать данные из Оракл, используя провайдер для него (и возможности этого провайдера), загнать полученную выборку в Excel, затем уже использовать Excel-евский провайдер JET или ACE.OLEDB для выборки с джойнами только на Excel-источниках...
...
Рейтинг: 0 / 0
Совместить результаты двух ADODB.Recordset
    #38526117
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM,

Ваша последовательность действия четка и ясна.

А уверена, что MJet - этого не может ?

У SAS (по моему) был такой алгоритма работы
SQLTEXT=select DESCR from BRANCH+навороты Oracle
это Native код - выполненный провайдером [ODBC.......Driver={Oracle.....]

Образованный DataSet c названием SQLTEXT и он обрабатываеться верхним
провайдером в виде таблицы [SQLTEXT] OPENROWSET()


rsA.Source = "select F1 from [Excel 8.0;HDR=YES;IMEX=1;DATABASE=C:\Temp\RR10.xls].[RR] union all select DESCR as F1 from [ODBC;SQLTEXT=select DESCR from BRANCH+навороті Oracle;Driver={Oracle in OraClient11g_home1};UID=zz;PWD=zz;DBQ=zz.zz;Server=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=zz.zz.z.zz)(PORT = zzzz))(CONNECT_DATA=(SERVER=DEDICATED)(SID = zzz)))].[SQLTEXT]"
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Совместить результаты двух ADODB.Recordset
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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