Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

разнотипные БД в одном запросе [D7, MSSQL, Access]


beriya ©   (2011-05-20 12:31:00) 

Здравствуйте, умные люди!

Есть таблица на MS SQL сервере и есть файл с базой данных Access Сканы.mdb Мне необходимо сделать запрос и из Скульной таблицы, и из Аццесовской, при этом используя ADO.
Искал, искал в интернете - есть варианты, но не работают.
В ADODataSet мне удобнее (но не принципиально) ставить Connection от SQL-сервера, а базу Акцессовскую удобнее писать вручную в самом запросе. типа
Select * from [;d:\Сканы].Товар
Дельфи такой запрос не принимает, если при этом коннекшн установлен Скульный. А такой конекшн мне нужен для того, чтобы добавить в запрос еще кое-что из Скульной базы данных.

Помогите, пожалуйста, если это вообще возможно...


lw   (2011-05-30 22:48:00) [1]

Создать в акцессной базе подключения к требуем таблицам.
Они станут доступны как обычные таблицы.


ов (дом)   (2011-05-20 16:57:00) [2]


> ак что внутри надо писать на том языке, на какой передается

разумеется

для Access, например, руки мозолями покроются joinы писать, придется в стиле "from t1, t2  "

Иногда приходится, делаю так: делаю в самом А, 'с лица', запрос чтоб работал, а потом переношу в программу


beriya   (2011-05-20 16:44:00) [3]

короче, когда коннекшн у ADODataSet настроен на акцессовскую БД, то получается сделать запрос из скульной таблицы таким образом:

select * from Товар IN  '' [ODBC;Driver={SQL Server};Server=server;DATABASE=Market_f]

в принципе, мне этого достаточно.
а вот наоборот, когда коннекшн нацелен на скул, а выборку делать из Акцесса - как ни бился, так и не смог заставить работать запрос. постоянно выдает "неправильная конструкция около IN".

Я так понимаю - ADO только передает текст запроса соответствующему провайдеру. так что внутри надо писать на том языке, на какой передается. А TransactSQL для SQL, для Access, да и даже для парадоксовских таблиц db весьма отличается один от другого. внешне похож, а в тонкостях то там оджна конструкция не работает,  то другая.... в свое время столкнулся при переходе с парадоксовских таблиц на скул, даже простейшие запросы не удавалось простым копированием перенести, приходилось ручками рихтовать


ов (дом)   (2011-05-20 16:05:00) [4]

а сколь велик mdb?
не проще ли будет bulk insert из него в tmpTable и join с реальной
и уже из  tmp в mdb скинуть


Anatoly Podgoretsky   (2011-05-20 14:12:00) [5]

> beriya  (20.05.2011 14:04:10)  [10]

Репликацию можно делать с принесеной бумажки, ручками.


Anatoly Podgoretsky   (2011-05-20 14:08:00) [6]

Надо изучать SQL нет никакой нужды в переборе, все это должно делаться одной командой


beriya   (2011-05-20 14:04:00) [7]

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


sniknik   (2011-05-20 14:01:00) [8]

> и там поставщик 4.0 ((((((
у тебя он тоже должен быть. проверь. во всяком случае 32битные приложения у меня с jet на 64 битной оси работают.
или 64 версия не ставится?
хотя, там вся разница в строке подключения. можно и 2/настраиваемо иметь...

> выбираю все записи из скульной в один дадасет
выбирай только идентификаторы...

> хранимые процедуры
пакет из команд в mssql работает ничуть не хуже процедуры, и все, типа переменные/курсоры и т.д. там тоже возможны.


Anatoly Podgoretsky   (2011-05-20 13:59:00) [9]

> beriya  (20.05.2011 13:32:06)  [6]

Гнилая попытка самопальной репликации.


b z   (2011-05-20 13:54:00) [10]

А если слинковать сервер?


beriya   (2011-05-20 13:32:00) [11]

я посмотрел, вообще задница:
в том офисе где я программирую сервер стоит Windows server 2008, MS SSQL 2008, все 64-битное, и там стоит поставщик OLE DB 12.0. ну настрою я поставщика, будет у меня в офисе работать.
а там где все это будет использоваться, на филиалах в других городах - стоит Windows server 2003 и SQL-2000 все 32-битное. и там поставщик 4.0 ((((((

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

на всякий случай изложу задачу целиком:
на sql-сервере есть таблица "Товар".
в mdb-базе тоже есть таблица "Товар".
И там, и там меня интересует только наименование.
Мне нужно взять из скульной таблицы те товары, которых нет в акцесовской. в данный момент я делаю ублюдочно: выбираю все записи из скульной в один дадасет. затем в дельфи перебираю все записи на предмет наличия в Акцесовской таблице. если нет, то добавляю. перебор занимает около минуты. тоска для юзеров и позор для меня-программиста.
а ведь наверняка все это можно было бы сделать одним запросом. Причем, я не имею права вносить изменения в SQL-базу, потому что она не моя, т.е. я не могу использовать представления, хранимые процедуры, так как при следующем обновлении все мои изменения улетучатся. А вот Акцесовская база моя - и там я могу творить все что угодно.


sniknik   (2011-05-20 13:19:00) [12]

настроить jet под пять потоков? (значение по умолчанию у "честной" 32битной оси)


Anatoly Podgoretsky   (2011-05-20 13:00:00) [13]

> beriya  (20.05.2011 12:31:00)  [0]

Их много вариантов, как сделать гетерогенный запрос, но читать надо не
всемирную помойку, а БОЛ


beriya   (2011-05-20 13:00:00) [14]

блиннн, выдает ошибку:

Невозможно использовать поставщик OLE DB "Microsoft.Jet.OLEDB.4.0" для распределенных запросов, поскольку поставщик настроен на работу в потоке контейнера с одним потоком

в инете пишут что это особенность 64-битного MS SQL 2008 (а у меня именно такой sql сервер стоит).

пока копаю сам как обойти, но если у вас на кончиках пальцев уже есть готовое решение, пожалуйста подскажите


b z   (2011-05-20 12:38:00) [15]

OPENROWSET


Ega23   (2011-05-20 12:37:00) [16]

http://msdn.microsoft.com/ru-ru/library/ms190312.aspx


Наверх

Титульная страница Поиск, карта сайта Написать письмо