Форум: "Базы";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];
ВнизАДО и запрос к гетерогенным источникам данных Найти похожие ветки
← →
Виталий Панасенко © (2008-02-01 09:13) [0]С АДО мало сталкиваюсь, но тут возникла необходимость в использовании этой технологии. Столкнулся с такой проблемой, которую не знаю, как решить в АДО. Нужно выбрать данные из одного источника, опираясь на значения из другого. Т.е. есть подключение к MS SQL, нужно выбрать из БД сервера данные, которые присутствуют в другом иоточнике данных, VFP, через ODBC. В BDE можно было сделать так: select * from maintable where key_field in (select key_field2 from ":ALIAS2:TABLE")..
А в АДО как можно проделать аналогичное ?
← →
Sergey13 © (2008-02-01 09:23) [1]Гетерогенные запросы вроде только БДЕ допускала.
Может можно ДБФ-ки подлинковать к скулю?
← →
Виталий Панасенко © (2008-02-01 09:32) [2]они на разных машинах лежат.. сервер - удаленный.. вроде нашел, OPENROWSET надо использовать
← →
Виталий Панасенко © (2008-02-01 10:02) [3]Пытаюсь выполнить такой запрос:
select top 5 s2.* from saldo s2
join
openrowset("MSDASQL","Persist Security Info=False;Data Source=REMOTE_ODBC", SALDO) S
on
cast(replace(s2.nls, substring(s2.nls,1, 4), substring(s2.nls,1, 4)+s2.kss) as varchar(14))=cast(nls as varchar(14))
where S.BLS=2202
получаю сообщение об ошибке:
Server: Msg 7399, Level 16, State 1, Line 1
OLE DB provider "MSDASQL" reported an error. The provider did not give any information about the error.
OLE DB error trace [OLE/DB Provider "MSDASQL" IDBInitialize::Initialize returned 0x80004005: The provider did not give any information about the error.].
Не подскажет никто, правильно ли я синтаксически написал запросик и что это за ошибка инициализации ? может, из-за кривости текста запроса ?
← →
sniknik © (2008-02-01 10:24) [4]> Гетерогенные запросы вроде только БДЕ допускала.
ADO не допускает, это только посредник, а запросы выполняет sql движок/сервер, в том числе и гетерогенные если конечно позволяет.
> правильно ли я синтаксически написал запросик
синтаксис похож... хотя и не понятны все эти замены в условии, что с чем сравнивается... т.е. скорее всего условие нерабочее, будеш пустой рекордсет получать. но это логика. а синтаксис запроса вроде верный. и еше в параметры openrowset бред передаешь, но и тут вопрос не об этом...
посмотри в BOL примеры по openrowset, и не лепи сразу "сложный" запрос, сделай минимум select * from openrowset(...), а вот когда разберешься/заработает можно и дальше.
и еще совет, не ставь имя таблицы в openrowset(..., ..., SALDO) зачем тебе тянуть ее всю если потом отсекаешь? задавай там запрос с предварительным условием ограничивающим количество данных.
← →
Виталий Панасенко © (2008-02-01 11:27) [5]передела так
select top 5 s2.* from
openrowset("MSDASQL","Persist Security Info=False;Data Source=REMOTE_ODBC", "select * from saldo where bls=2202") S2
нет тяну всю таблицу.. пытаюсь выполнить в Query Analizerе - ошибка та же
Server: Msg 7399, Level 16, State 1, Line 1
OLE DB provider "MSDASQL" reported an error. The provider did not give any information about the error.
OLE DB error trace [OLE/DB Provider "MSDASQL" IDBInitialize::Initialize returned 0x80004005: The provider did not give any information about the error.].
На счет параметров бредовых не понял? я взял и копипастом (чуть подрехтовав) из ConnectionString ADOConnectiong вытянул. Лишние ? Или ошибочные ?
← →
Anatoly Podgoretsky © (2008-02-01 11:33) [6]Вопрос лучше задать в форуме по MS SQL на sql.ru
Вариантов выполнения гетерогенных запросов в MS SQL множество, в том числе и самые разнообразные функции OPENxx, а не только openrowset и конечно прилинкованые серверы.
← →
MsGuns © (2008-02-01 11:54) [7]MS SQL Server DTS
либо
Два коннекта и два датасета на клиенте - из одного последовательно читать, а в другой добавлять
← →
sniknik © (2008-02-01 12:04) [8]> Вопрос лучше задать в форуме по MS SQL на sql.ru
с тем же успехом... имхо.
> На счет параметров бредовых не понял?
openrowset("MSDASQL","Persist Security Info=False;Data Source=REMOTE_ODBC", "select * from saldo where bls=2202")
выделенное бред, обрывки чегото, набор ничем не связанных слов, ты обращаешься к ODBC (первый параметр "MSDASQL") и даже не указываешь драйвер/dsn который должен обработать твой запрос.
при том что в BOL приведен вполне рабочий пример.
← →
sniknik © (2008-02-01 12:08) [9]про запрос это был всего лиш совет, а не руководство по исправлению глюка (руководством можно считать про просмотр BOL)
еще совет такого же плана...
> select * from saldo ...
тебе нужны все поля?
← →
Виталий Панасенко(дом) (2008-02-01 14:17) [10]одно.. но ведь суть в том, что "не заводится"... точнее, синтаксис правильный, но ....
← →
sniknik © (2008-02-01 14:46) [11]> точнее, синтаксис правильный, но ....
var
dt: TDateTime;
begin
dt:= StrToDateTime("гдето в мае когда полюбила я в первый раз...");
...
end;
синтаксис правильный? правильный. работать будет? ...
← →
ANB (2008-02-01 16:43) [12]
> Виталий Панасенко(дом) (01.02.08 14:17) [10]
Значится обойти можно так (пробовал только с ораклом + мс скл).
В МС СКЛ настраивается удаленный сервер вроде как на основе ОДБС источника данных. Делаем эти шлюзы ко все нужным базам. Потом через АДО подключаемся к МС СКЛ и гоним запросы в него.
Во всяком случае в оракл без проблем лазит. Обратный шлюз (из оракла в мс скл) работает и настраивается намного хуже.
Есть мощная грабля. Запросы через шлюз должны быть совместимы с ОБОИМИ субд. Ну и гетерогенные по любому будут тормозить.
Приемлемый выход - собрать данные из разных источников в мс скл и уже там извращаться.
← →
sniknik © (2008-02-01 17:04) [13]> Значится обойти можно так (пробовал только с ораклом + мс скл).
у меня меня вопрос - зачем ОБХОДИТЬ?... ЧТО обходить? тупость свою? неспособность вместо
> StrToDateTime("гдето в мае когда полюбила я в первый раз...");
написать
StrToDateTime("05.15.2007"); (или др. в зависимости от локализации/драйвера в варианте с openrowset)
????
боюсь ЭТО, никакие советы "обойти" не помогут...
← →
ANB (2008-02-01 17:35) [14]
> sniknik © (01.02.08 17:04) [13]
а зачем писать опенровсет, если мона просто к таблицу селекнуть ?
← →
sniknik © (2008-02-01 17:57) [15]> а зачем писать опенровсет, если мона просто к таблицу селекнуть ?
подключение к mssql на одной машине, а через опенровсет получаются данные с другой, для объединения/переноса/т.д. ... а на другой даже не mssql а тот же oracle (у автора визуал фокспро).
попробуй "селектни к таблицу" без него.
это же и есть гетерогенный запрос. основы.
либо так, учить основы, либо
MsGuns © (01.02.08 11:54) [7]
> Два коннекта и два датасета на клиенте - из одного последовательно читать, а в другой добавлять
и скорость вместо секунд минуты, вместо минут часы...
← →
Виталий Панасенко(дом) (2008-02-02 15:12) [16]Видимо, нашел, что нужно... Проверю в понедельник...
select * from
OPENROWSET("MSDASQL",
"DRIVER={Microsoft Visual FoxPro Driver};
Exclusive=No;Collate=Russian;Deleted=Yes;Null=No;
SourceDB=D:\Data_OBM\anmo\DataTMP.dbc;SourceType=DBC;",
"SELECT * FROM tbContact")
только свои данные подставить...Написано на форуме, что рабочее, только кодировка не та.. а у меня там счета, цифры...
← →
Виталий Панасенко(дом) (2008-02-02 15:14) [17]Кстати, нашел на SQL.RU.. это я о
> Anatoly Podgoretsky © (01.02.08 11:33) [6]
и
> sniknik © (01.02.08 12:04) [8]
:-)
← →
sniknik © (2008-02-02 18:03) [18]> Кстати, нашел на SQL.RU.. это я о
думаешь это уже все? а скажи, у тебя именно база VFP& или просто файлы в формате? потому как нашел вариант ты именно для базы... хотя уже близко. не бред.
← →
Виталий Панасенко(дом) (2008-02-03 10:07) [19]Файлы... видимо, нужно копать в сторону SourceType=DBC;
← →
Виталий Панасенко(дом) (2008-02-03 10:08) [20]можно и дома проверить...
← →
Виталий Панасенко(дом) (2008-02-03 10:15) [21]select * from
OPENROWSET("MSDASQL",
"DRIVER={Microsoft Visual FoxPro Driver};
Exclusive=No;Collate=Russian;Deleted=Yes;Null=No;
SourceDB=c:\;SourceType=DBF;",
"SELECT * FROM s60534")
УРА, ЗАРАБОТАЛО!!!(с) Кот Матроскин
← →
Виталий Панасенко © (2008-02-04 09:49) [22]Но не все так просто оказалось.. БД фокс лежит у меня в сетке, а MS SQL - удаленный.И, я так понимаю, мой запрос не работает, т.к. MS SQL пытается найти таблицы фокса У СЕБЯ ЛОКАЛЬНО, т.е. там, где MS SQL "живет"... а это в 100 км от меня..:-). А дома я подключался локально, потому и работает..Можно как-то эту проблему решить ? Если да, то как ?
← →
sniknik © (2008-02-04 10:23) [23]> Можно как-то эту проблему решить ? Если да, то как ?
посмотреть есть ли возможность гетерогенных запросов у локального движка, того который и местные таблицы видит и к тому северу доступ имеет...
либо поменять на другой, такой возможностью обладающий.
либо расшарить твой каталог для сервера с mssql.
(смысл сделать движку видимыми обе базы и чтоб он мог...).
либо "рабочекрестьянский" метод с 2 мя коннектами и перекладыванием, как уже предлагали, и плевать на гетерогенность.
← →
Виталий Панасенко © (2008-02-04 11:18) [24]мне не перекладывать нужно.. а выбрать с сервера то, что есть у меня в локалке...
← →
sniknik © (2008-02-04 12:58) [25]> мне не перекладывать нужно.. а выбрать с сервера то, что есть у меня в локалке...
значит не перекладывая, а выбирай... главное чтобы в том чем выбираешь был доступ к обоим базам и позволялась "гетерогенность" иначе делай то что делаешь другими средствами. (гетерогенный запрос, про который вопрос, надеюсь не самоцель... ?)
← →
Виталий Панасенко(дом) (2008-02-04 14:43) [26]Думаю, проще будет выбрать из локальной БД нужные счета и программно подложить их в запрос для MS SQL... там выгрузка в эксель через OLE, занимает где-то 7 минут...Так что 1-2 секунды будут не актуальны(а может и того меньше).
Правда, проглотит ли сервер запрос, в котором будет около 600-700 NLS=VALUE2 OR NLS=VALUE2... думаю, должен
← →
sniknik © (2008-02-04 15:05) [27]> там выгрузка в эксель через OLE, занимает где-то 7 минут...
?
че так долго то? аксесс столько записей не держит чтобы больше минуты их через OLE "засасывать".
> в котором будет около 600-700 NLS=VALUE2 OR NLS=VALUE2... думаю, должен
есть ограничение на размер запроса (зависит от провайдера т.е. для access один для mssql другой. вроде бы)... т.е. в принципе может и "забыковать".
не помню какой там размер, знал когдато, но забыл т.к. практически недостижим... (у меня запросы редко 2 экранные страницы превышают... т.е. > 100 строк не бывает. но с твоим подходом возможно)
← →
Виталий Панасенко(дом) (2008-02-04 15:14) [28]Я по ячейкам, + анализ данных, постройка формул...хотя, может и гоню..но это не критично.. так как руками это люди делают 2 дня, 3-4 человека..:-)
← →
ANB (2008-02-04 15:39) [29]
> около 600-700 NLS=VALUE2 OR NLS=VALUE2... думаю, должен
Заменить на where NLS in (select NLS_VALUE from TmpTable1). И должно съесть.
← →
Виталий Панасенко © (2008-02-04 17:12) [30]А как их туда втюхать ? я о TmpTable1.. загрузить с локалки, прописать в\о временную таблицу на сервере и сделать выборку ?
← →
ANB (2008-02-04 17:16) [31]
> А как их туда втюхать ? я о TmpTable1.. загрузить с локалки,
> прописать в\о временную таблицу на сервере и сделать выборку
> ?
> <Цитата>
И какие проблемы ? Кстати, самый простой способ. Иначе придется учить сервер лазить на локалку к каждому юзеру, что не есть гуд.
тыщ 5 записей загружаются очень быстро, особенно если не вешать на времянку триггеров и индексов. Ну и грузить аккуратно препарированным запросом (впрочем, есть любители и пакетной загрузки, просто мне лично пакетная загрузка не нравится)
← →
Виталий Панасенко(дом) (2008-02-05 09:04) [32]
> ANB (04.02.08 17:16) [31]
и особенно, если канал - 19200..:-).. правда, правда... и при этом по нему еще и почта ходит
← →
ANB (2008-02-05 11:18) [33]
> и особенно, если канал - 19200..:-)..
Ну тады надо пересылать свой файл (точнее нужный кусочек), на сервер, а там уже разбирать и класть во времянку.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.007 c