Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.13;
Скачать: CL | DM;

Вниз

АДО и запрос к гетерогенным источникам данных   Найти похожие ветки 

 
Виталий Панасенко ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.035 c
11-1189856395
Robt
2007-09-15 15:39
2008.07.13
ComboBox


2-1213469824
VovKul
2008-06-14 22:57
2008.07.13
Как прочитать HTML файл как текст


15-1211867440
@!!ex_
2008-05-27 09:50
2008.07.13
Оцените пожалуйста срикпт. Насколько он "нормальный"?


2-1213186477
Helpme_
2008-06-11 16:14
2008.07.13
Помогите


2-1213422535
WebSQLNeederr
2008-06-14 09:48
2008.07.13
Как скопировать в TImage изображение <img> загруженной в TWebBrow