Несколько баз и рекордсетов

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
SerJay
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 06.05.2005 (Пт) 17:12
Откуда: Казахстан

Несколько баз и рекордсетов

Сообщение SerJay » 21.01.2009 (Ср) 18:52

Доброго времени суток!
Ребята подскажите, есть несколько баз данных access (структура одинакова, пути разные).
Возможно ли сделать запрос, в цикле ко всем базам получить рекордсеты каждой базы объединить UNION и загрузить в таблицу?
Таким способом загружаю из одной базы...Использую Janus Grid

'код на форме
Set rsEmp = New ADODB.Recordset
Set Employees = New DataConn
Set rsEmp = Employees.GetEmployees_option1 ' get the employee records
Set Grid_1.ADORecordset = rsEmp ' show the employee records
Set rsEmp = Nothing
Set Employees = Nothing


'код в модуле (функция GetEmployees_option1)

conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & SMSERVER & ":\SMSERVER\BRAND\1.mdb" ' open a connection
rs.Open "select * from OTHER where [MODEL] LIKE '" & form2.search.text & "' ORDER BY ID ASC", conn ' fill the recordset.
Set rs.ActiveConnection = Nothing ' remove the database connection.
Set GetEmployees_option1 = rs
conn.Close ' close the database connection, but we still have access to the recordset.

Спасибо!

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Несколько баз и рекордсетов

Сообщение iGrok » 21.01.2009 (Ср) 19:20

Можно слинковать все БД средствами Access (связанные таблицы), и сделать один нормальный запрос с UNION.
Либо средствами того же Access создать новую БД, куда будут прилинкованы все эти, и опять же сделать один запрос.
label:
cli
jmp label

SerJay
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 06.05.2005 (Пт) 17:12
Откуда: Казахстан

Re: Несколько баз и рекордсетов

Сообщение SerJay » 22.01.2009 (Чт) 5:07

iGrok писал(а):Можно слинковать все БД средствами Access (связанные таблицы), и сделать один нормальный запрос с UNION.
Либо средствами того же Access создать новую БД, куда будут прилинкованы все эти, и опять же сделать один запрос.


А нельзя это сделать средствами VB?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Несколько баз и рекордсетов

Сообщение alibek » 22.01.2009 (Чт) 9:00

Нет разницы, какими средствами это делать.
Суть одна и та же.
Lasciate ogni speranza, voi ch'entrate.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Несколько баз и рекордсетов

Сообщение iGrok » 22.01.2009 (Чт) 17:00

Если создавать БД с прилинкованными таблицами средствами VB - ADOX тебе в помощь...
label:
cli
jmp label

SerJay
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 06.05.2005 (Пт) 17:12
Откуда: Казахстан

Re: Несколько баз и рекордсетов

Сообщение SerJay » 23.01.2009 (Пт) 16:09

Спасибо, будем пробовать...

SerJay
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 06.05.2005 (Пт) 17:12
Откуда: Казахстан

Re: Несколько баз и рекордсетов

Сообщение SerJay » 26.01.2009 (Пн) 16:37

Еще раз скажу спасибо с ADOX все получилось, вот ссылка http://bbs.vbstreets.ru/viewtopic.php?f=5&t=30282&hilit=ADOX на функцию линковки таблиц может кому пригодиться...

Возник еще один вопрос...Как в одном запросе объединить все эти таблицы?
Проблема в том, что таблиц может быть до 50. Какое количество таблиц я определяю, но как сделать проверку и объединение?
Проверку можно сделать таким примитивным способом (если таблиц 3):

Код: Выделить всё
For qty = 1 To Количество таблиц
strSQL_all_(qty) = "select * from " & qty & " where [MODEL] LIKE '" & Текст запроса & "' ORDER BY ID ASC"
next

If Таблиц = 3 Then
strSQL = "(" & strSQL_all_(1) & ") UNION (" & strSQL_all_(2) & ") UNION (" & strSQL_all_(3) & ")"
End If


Но, а если таблиц скажем 45?
Как программно объединить эти 45 таблиц в запросе?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Несколько баз и рекордсетов

Сообщение iGrok » 26.01.2009 (Пн) 18:34

Первую часть оставляешь как есть. Вторую меняешь на:
Код: Выделить всё
strSQL = "(" & Join( strSQL_all_ ,  ") UNION (" ) & ")"


По идее, будет действовать для любого кол-ва таблиц.
label:
cli
jmp label

SerJay
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 06.05.2005 (Пт) 17:12
Откуда: Казахстан

Re: Несколько баз и рекордсетов

Сообщение SerJay » 26.01.2009 (Пн) 19:39

iGrok писал(а):Первую часть оставляешь как есть. Вторую меняешь на:
Код: Выделить всё
strSQL = "(" & Join( strSQL_all_ ,  ") UNION (" ) & ")"


По идее, будет действовать для любого кол-ва таблиц.


Спасибо, идея хорошая, по идее объединяет, но...пишет слишком сложный запрос. Это три таблицы, и огромное количество UNION ()... :?:

Код: Выделить всё
(select * from 0 where [MODEL] LIKE 'Текст_запроса' ORDER BY ID ASC) UNION (select * from 1 where [MODEL] LIKE 'Текст_запроса' ORDER BY ID ASC) UNION (select * from 2 where [MODEL] LIKE 'Текст_запроса' ORDER BY ID ASC) UNION () UNION () UNION () UNION () UNION () UNION () UNION () UNION () UNION () UNION () UNION () UNION () UNION () UNION () UNION () UNION () UNION () UNION () UNION () UNION

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Несколько баз и рекордсетов

Сообщение alibek » 26.01.2009 (Пн) 21:23

Можешь соединять их в View и работать с представлением.
Можешь создавать временную таблицу и выгружать туда.

Почему не подходит запуск обработки для каждой базы отдельно?
Lasciate ogni speranza, voi ch'entrate.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Несколько баз и рекордсетов

Сообщение iGrok » 26.01.2009 (Пн) 22:03

SerJay писал(а):Спасибо, идея хорошая, по идее объединяет, но...пишет слишком сложный запрос. Это три таблицы, и огромное количество UNION ()... :?:
Ой жуть какая. =)
Я ж не знал, что у тебя массив фиксированного размера, да ещё и достаточно большой. =)
Ты массив переобъяви в самом начале с тем размером, который нужен:

Код: Выделить всё
'Там, где у тебя в программе Dim strSQL_all_(размер) нужно написать
Dim strSQL_all_() As String

'Потом, когда узнаешь сколько у тебя всего таблиц нужно сделать:
ReDim strSQL_all_(tables_count - 1)

И потом уже остальной код.
label:
cli
jmp label

SerJay
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 06.05.2005 (Пт) 17:12
Откуда: Казахстан

Re: Несколько баз и рекордсетов

Сообщение SerJay » 27.01.2009 (Вт) 18:39

iGrok спасибо тебе огромное...все получилось!

SerJay
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 06.05.2005 (Пт) 17:12
Откуда: Казахстан

Re: Несколько баз и рекордсетов

Сообщение SerJay » 11.10.2009 (Вс) 7:19

Доброго времени суток. Возникла еще одна проблема.
Линкую все таблицы в одну базу, циклом прохожу по таблицам с запросом.

Код: Выделить всё
Объединяю  запросы                                   
strSQL = "(" & Join(strSQL_all_brand, ") UNION (") & ")"


Код: Выделить всё
Открываю рекордсет   
rs.Open strSQL & " ORDER BY BRAND ASC", conn


Проблема в том что если таблиц более 50, возникает ошибка "Слишком сложный запрос".
Получается длинный запрос. Подскажите как справиться с данной проблемой. Или другой путь
выборки по базам. Может быть проще объединять рекордсеты? Напомню, у меня базы данных access (теперь их может быть около 100) структура одинаковая, пути разные. Необходимо делать поиск по всем базам и результат грузить в рекордсет. Заранее спасибо

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Несколько баз и рекордсетов

Сообщение iGrok » 11.10.2009 (Вс) 14:12

SerJay писал(а):Необходимо делать поиск по всем базам и результат грузить в рекордсет. Заранее спасибо

Ммм.. Я бы действительно попробовал сделать View, в котором объединить union'ами все таблицы.
Ну или сделать несколько view, скажем, по 10 таблиц.
А потом объединял запросы к ним union'ами.

А зачем тебе выкидывать ВСЕ результаты в один рекордсет? Может, использовать какую-то другую структуру для хранения результата?
Получать по отдельности для каждой таблицы, и перекидывать в свою структуру.
label:
cli
jmp label

SerJay
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 06.05.2005 (Пт) 17:12
Откуда: Казахстан

Re: Несколько баз и рекордсетов

Сообщение SerJay » 13.10.2009 (Вт) 5:11

iGrok писал(а):Ну или сделать несколько view, скажем, по 10 таблиц.


Вот этот вариант попробую. Спасибо

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Несколько баз и рекордсетов

Сообщение Andrey Fedorov » 13.10.2009 (Вт) 14:52

iGrok писал(а):А зачем тебе выкидывать ВСЕ результаты в один рекордсет? Может, использовать какую-то другую структуру для хранения результата?


Собственно чтобы скинуть все записи в один Recordset вполне достаточно открывать таблички по одной и копировать их содержимое в один отвязанный Recordset. Кстати, чтобы обратиться к внешней табличке совсем не обязательно ее линковать - достаточно вспомнить синтаксис:

Код: Выделить всё
SELECT списокПолей
    FROM выражение [IN внешняяБазаДанных]


А с UNION он рано или поздно наткнется на ограничения. Да вроде уже наткнулся - и вьюшки ему в этом деле не помогут, насколько я помню...

Сколько хоть записей в этих 50-и табличках?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

SerJay
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 06.05.2005 (Пт) 17:12
Откуда: Казахстан

Re: Несколько баз и рекордсетов

Сообщение SerJay » 15.10.2009 (Чт) 18:38

Andrey Fedorov писал(а):копировать их содержимое в один отвязанный Recordset


Андрей не подскажешь как это делать?

Andrey Fedorov писал(а):Сколько хоть записей в этих 50-и табличках?


От 500 до 5000 записей в каждой.

SerJay
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 06.05.2005 (Пт) 17:12
Откуда: Казахстан

Re: Несколько баз и рекордсетов

Сообщение SerJay » 17.10.2009 (Сб) 6:32

Возможно неправильно выразился...Мне не нужно грузить все записи всех таблиц в рекордсет. В запросе идет поиск по данным всех таблиц. После этого найденные записи отображаются в JanusGRIDe

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Несколько баз и рекордсетов

Сообщение Andrey Fedorov » 26.11.2009 (Чт) 9:47

SerJay писал(а):
Andrey Fedorov писал(а):копировать их содержимое в один отвязанный Recordset

Андрей не подскажешь как это делать?


Да примитивно:

Dim r As New ADODB.Recordset
f.Fields.Append "Field1", ....
f.Fields.Append "Field2", ....
...
r.Open

Ну а далее заполняешь этот Recordset и отдаешь его Grid-у.

Andrey Fedorov писал(а):Сколько хоть записей в этих 50-и табличках?

От 500 до 5000 записей в каждой.[/quote]

И их все сразу юзер должен видеть? Может заставить его все же ввести условие?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 36

    TopList