-
Здравствуйте, умные люди!
Есть таблица на MS SQL сервере и есть файл с базой данных Access Сканы.mdb Мне необходимо сделать запрос и из Скульной таблицы, и из Аццесовской, при этом используя ADO. Искал, искал в интернете - есть варианты, но не работают. В ADODataSet мне удобнее (но не принципиально) ставить Connection от SQL-сервера, а базу Акцессовскую удобнее писать вручную в самом запросе. типа Select * from [;d:\Сканы].Товар Дельфи такой запрос не принимает, если при этом коннекшн установлен Скульный. А такой конекшн мне нужен для того, чтобы добавить в запрос еще кое-что из Скульной базы данных.
Помогите, пожалуйста, если это вообще возможно...
-
-
OPENROWSET
-
> beriya (20.05.2011 12:31:00) [0]
Их много вариантов, как сделать гетерогенный запрос, но читать надо не всемирную помойку, а БОЛ
-
блиннн, выдает ошибку:
Невозможно использовать поставщик OLE DB "Microsoft.Jet.OLEDB.4.0" для распределенных запросов, поскольку поставщик настроен на работу в потоке контейнера с одним потоком
в инете пишут что это особенность 64-битного MS SQL 2008 (а у меня именно такой sql сервер стоит).
пока копаю сам как обойти, но если у вас на кончиках пальцев уже есть готовое решение, пожалуйста подскажите
-
настроить jet под пять потоков? (значение по умолчанию у "честной" 32битной оси)
-
я посмотрел, вообще задница: в том офисе где я программирую сервер стоит Windows server 2008, MS SSQL 2008, все 64-битное, и там стоит поставщик OLE DB 12.0. ну настрою я поставщика, будет у меня в офисе работать. а там где все это будет использоваться, на филиалах в других городах - стоит Windows server 2003 и SQL-2000 все 32-битное. и там поставщик 4.0 ((((((
спасибо за советы, порою в другом направлении. Этот вопрос я хотел бы решить, было бы приятно, но и без него не помру.
на всякий случай изложу задачу целиком: на sql-сервере есть таблица "Товар". в mdb-базе тоже есть таблица "Товар". И там, и там меня интересует только наименование. Мне нужно взять из скульной таблицы те товары, которых нет в акцесовской. в данный момент я делаю ублюдочно: выбираю все записи из скульной в один дадасет. затем в дельфи перебираю все записи на предмет наличия в Акцесовской таблице. если нет, то добавляю. перебор занимает около минуты. тоска для юзеров и позор для меня-программиста. а ведь наверняка все это можно было бы сделать одним запросом. Причем, я не имею права вносить изменения в SQL-базу, потому что она не моя, т.е. я не могу использовать представления, хранимые процедуры, так как при следующем обновлении все мои изменения улетучатся. А вот Акцесовская база моя - и там я могу творить все что угодно.
-
А если слинковать сервер?
-
> beriya (20.05.2011 13:32:06) [6]
Гнилая попытка самопальной репликации.
-
> и там поставщик 4.0 (((((( у тебя он тоже должен быть. проверь. во всяком случае 32битные приложения у меня с jet на 64 битной оси работают. или 64 версия не ставится? хотя, там вся разница в строке подключения. можно и 2/настраиваемо иметь...
> выбираю все записи из скульной в один дадасет выбирай только идентификаторы...
> хранимые процедуры пакет из команд в mssql работает ничуть не хуже процедуры, и все, типа переменные/курсоры и т.д. там тоже возможны.
-
не совсем репликации. там еще человек участвует. сперва с помощью того что я описал я получаю разницу двух таблиц, человеку выводится на экран только те товары, которые есть в скульной таблице, но еще нет в акцесовской. затем человек ставит галочки на тех товарах, которые он хочет забрать из скульной таблицы, нажимает кнопку и только после этого, только отмеченные записи я добавляю в акцесовскую. так что смысл в этой работе есть. просто чтобы получить разницу двух таблиц приходится идти путем деградировавшего вахтера из общежития кулинарного пту
-
Надо изучать SQL нет никакой нужды в переборе, все это должно делаться одной командой
-
> beriya (20.05.2011 14:04:10) [10]
Репликацию можно делать с принесеной бумажки, ручками.
-
а сколь велик mdb? не проще ли будет bulk insert из него в tmpTable и join с реальной и уже из tmp в mdb скинуть
-
короче, когда коннекшн у ADODataSet настроен на акцессовскую БД, то получается сделать запрос из скульной таблицы таким образом:
select * from Товар IN '' [ODBC;Driver={SQL Server};Server=server;DATABASE=Market_f]
в принципе, мне этого достаточно. а вот наоборот, когда коннекшн нацелен на скул, а выборку делать из Акцесса - как ни бился, так и не смог заставить работать запрос. постоянно выдает "неправильная конструкция около IN".
Я так понимаю - ADO только передает текст запроса соответствующему провайдеру. так что внутри надо писать на том языке, на какой передается. А TransactSQL для SQL, для Access, да и даже для парадоксовских таблиц db весьма отличается один от другого. внешне похож, а в тонкостях то там оджна конструкция не работает, то другая.... в свое время столкнулся при переходе с парадоксовских таблиц на скул, даже простейшие запросы не удавалось простым копированием перенести, приходилось ручками рихтовать
-
> ак что внутри надо писать на том языке, на какой передается
разумеется
для Access, например, руки мозолями покроются joinы писать, придется в стиле "from t1, t2 "
Иногда приходится, делаю так: делаю в самом А, 'с лица', запрос чтоб работал, а потом переношу в программу
-
Создать в акцессной базе подключения к требуем таблицам. Они станут доступны как обычные таблицы.
|