Конференция "Базы" » разнотипные БД в одном запросе [D7, MSSQL, Access]
 
  • beriya © (20.05.11 12:31) [0]
    Здравствуйте, умные люди!

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

    Помогите, пожалуйста, если это вообще возможно...
  • Ega23 © (20.05.11 12:37) [1]
  • b z (20.05.11 12:38) [2]
    OPENROWSET
  • Anatoly Podgoretsky © (20.05.11 13:00) [3]
    > beriya  (20.05.2011 12:31:00)  [0]

    Их много вариантов, как сделать гетерогенный запрос, но читать надо не
    всемирную помойку, а БОЛ
  • beriya © (20.05.11 13:00) [4]
    блиннн, выдает ошибку:

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

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

    пока копаю сам как обойти, но если у вас на кончиках пальцев уже есть готовое решение, пожалуйста подскажите
  • sniknik © (20.05.11 13:19) [5]
    настроить jet под пять потоков? (значение по умолчанию у "честной" 32битной оси)
  • beriya © (20.05.11 13:32) [6]
    я посмотрел, вообще задница:
    в том офисе где я программирую сервер стоит Windows server 2008, MS SSQL 2008, все 64-битное, и там стоит поставщик OLE DB 12.0. ну настрою я поставщика, будет у меня в офисе работать.
    а там где все это будет использоваться, на филиалах в других городах - стоит Windows server 2003 и SQL-2000 все 32-битное. и там поставщик 4.0 ((((((

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

    на всякий случай изложу задачу целиком:
    на sql-сервере есть таблица "Товар".
    в mdb-базе тоже есть таблица "Товар".
    И там, и там меня интересует только наименование.
    Мне нужно взять из скульной таблицы те товары, которых нет в акцесовской. в данный момент я делаю ублюдочно: выбираю все записи из скульной в один дадасет. затем в дельфи перебираю все записи на предмет наличия в Акцесовской таблице. если нет, то добавляю. перебор занимает около минуты. тоска для юзеров и позор для меня-программиста.
    а ведь наверняка все это можно было бы сделать одним запросом. Причем, я не имею права вносить изменения в SQL-базу, потому что она не моя, т.е. я не могу использовать представления, хранимые процедуры, так как при следующем обновлении все мои изменения улетучатся. А вот Акцесовская база моя - и там я могу творить все что угодно.
  • b z (20.05.11 13:54) [7]
    А если слинковать сервер?
  • Anatoly Podgoretsky © (20.05.11 13:59) [8]
    > beriya  (20.05.2011 13:32:06)  [6]

    Гнилая попытка самопальной репликации.
  • sniknik © (20.05.11 14:01) [9]
    > и там поставщик 4.0 ((((((
    у тебя он тоже должен быть. проверь. во всяком случае 32битные приложения у меня с jet на 64 битной оси работают.
    или 64 версия не ставится?
    хотя, там вся разница в строке подключения. можно и 2/настраиваемо иметь...

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

    > хранимые процедуры
    пакет из команд в mssql работает ничуть не хуже процедуры, и все, типа переменные/курсоры и т.д. там тоже возможны.
  • beriya © (20.05.11 14:04) [10]
    не совсем репликации. там еще человек участвует.
    сперва с помощью того что я описал я получаю разницу двух таблиц, человеку выводится на экран только те товары, которые есть в скульной таблице, но еще нет в акцесовской. затем человек ставит галочки на тех товарах, которые он хочет забрать из скульной таблицы, нажимает кнопку и только после этого, только отмеченные записи я добавляю в акцесовскую. так что смысл в этой работе есть. просто чтобы получить разницу двух таблиц приходится идти путем деградировавшего вахтера из общежития кулинарного пту
  • Anatoly Podgoretsky © (20.05.11 14:08) [11]
    Надо изучать SQL нет никакой нужды в переборе, все это должно делаться одной командой
  • Anatoly Podgoretsky © (20.05.11 14:12) [12]
    > beriya  (20.05.2011 14:04:10)  [10]

    Репликацию можно делать с принесеной бумажки, ручками.
  • ов (дом) (20.05.11 16:05) [13]
    а сколь велик mdb?
    не проще ли будет bulk insert из него в tmpTable и join с реальной
    и уже из  tmp в mdb скинуть
  • beriya © (20.05.11 16:44) [14]
    короче, когда коннекшн у ADODataSet настроен на акцессовскую БД, то получается сделать запрос из скульной таблицы таким образом:

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

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

    Я так понимаю - ADO только передает текст запроса соответствующему провайдеру. так что внутри надо писать на том языке, на какой передается. А TransactSQL для SQL, для Access, да и даже для парадоксовских таблиц db весьма отличается один от другого. внешне похож, а в тонкостях то там оджна конструкция не работает,  то другая.... в свое время столкнулся при переходе с парадоксовских таблиц на скул, даже простейшие запросы не удавалось простым копированием перенести, приходилось ручками рихтовать
  • ов (дом) (20.05.11 16:57) [15]

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

    разумеется

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

    Иногда приходится, делаю так: делаю в самом А, 'с лица', запрос чтоб работал, а потом переношу в программу
  • lw (30.05.11 22:48) [16]
    Создать в акцессной базе подключения к требуем таблицам.
    Они станут доступны как обычные таблицы.
 
Конференция "Базы" » разнотипные БД в одном запросе [D7, MSSQL, Access]
Есть новые Нет новых   [134431   +13][b:0][p:0]