Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
15-1211801480
тимохов
2008-05-26 15:31
2008.07.13
Совсем оффтоп, но на вас вся надежда


15-1211871564
Desdechado
2008-05-27 10:59
2008.07.13
Вот интересно


15-1211788555
lead-in
2008-05-26 11:55
2008.07.13
ключи для sfx rar


15-1212046676
Azize
2008-05-29 11:37
2008.07.13
GeForse vs ATI


2-1213459535
VovKul
2008-06-14 20:05
2008.07.13
Как узнать полный путь к выделенному файлу в ShellListView?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский