Алиас не найден ... | |
---|---|
Dionnis Сообщений: 5 Дата регистрации: 17.01.2005 |
Всем добрый день!
Столкнулся со следующей проблемой: Сразу скажу что работаю с dbf таблицами через Delphi при помощи провайдера Microsoft OLE DB Provider for Visual FoxPro. Опубликовал тему не на форуме Delphi, так как проблема именно касается Fox'а. Я выполняю импорт данных из dbf файла в mdb. Обрабатывается большой объём даных по циклу, где для проверки даных производятся запросы к различным dbf - таблицам. При выполнении запросов используются хранимые процедуры, описанные в файле dbc., ниже представлен код одной из процедур (их код аналогичен, меняется только название таблицы к которой адресован запрос): PROCEDURE GetDeloN PARAM M.ND LOCAL lcAliasName SET EXCLUSIVE OFF lcAliasName = 'a' + SYS(2015) USE DELO IN 0 AGAIN SHARED ALIAS (lcAliasName) SELE (lcAliasName) SET INDEX TO IDELO.CDX SET ORDER TO TAG NOM SELECT * FROM (lcAliasName) WHERE (NOM=M.ND) INTO CURSOR TmpDbf NOFILTER SELE (lcAliasName) USE RETURN И в какойто момент времени у меня возникает ошибка: Alias (имя Алиаса) is not found. С чем это может быть связано, может быть в ХП чтото неверно написано? |
Re: Алиас не найден ... | |
---|---|
GS Сообщений: 5 Дата регистрации: 07.02.2005 |
Hi, Dionnis!
Может быть, несколько упростить код, чтобы проще было найти ошибку, либо вообще её обойти: PROCEDURE GetDeloN (m.ND) SET EXCLUSIVE OFF USE DELO IN 0 AGAIN SHARED ALIAS Delo1 ORDER NOM OF "IDELO.CDX" && Фиксированный алиас (всё равно потом закрывать) SELECT * FROM Delo1 WHERE NOM = m.ND INTO CURSOR TmpDbf NOFILTER USE IN SELECT("Delo1") && Достаточно даже USE IN Delo1, т.к. если таблица DELO не будет открыта по тем или иным причинам, то выскочит ошибка на команде USE RETURN P.S. Кстати, из каких соображений таблице DELO соответствует индексный файл IDELO.CDX? Если таблице DELO будет соответствовать индексный файл DELO.CDX, то он откроется автоматически, а SQL-запрос сам найдёт индекс по полю NOM, т.е. достаточно написать: USE DELO IN 0 AGAIN SHARED ALIAS Delo1 SELECT * FROM Delo1 ... |
Re: Алиас не найден ... | |
---|---|
Igor Korolyov Автор Сообщений: 34580 Дата регистрации: 28.05.2002 |
Hi, Dionnis!
Мягко говоря странная процедура - и как же вы умудряетесь пользоваться такой через Ole DB провайдера? Она ничего не возвращает, никаких постоянных объектов нигде не создаёт (а до созданного ею курсора "извне" достучаться AFAIK нельзя вплоть до VFP9 - но даже там нужны доп. команды)... Да и НАЗНАЧЕНИЕ процедуры непонятно - надо определить есть ли запись с таким кодом? Или посчитать сколько таких записей? Кроме того полное отсутствие обработчика ошибок это явный прокол разработчика - например недоступна соответствующая таблица и что тогда? Кстати указать используемую версию VFP и VFP OLE DB Provider явно не лишним будет. ------------------ WBR, Igor |
Re: Алиас не найден ... | |
---|---|
Dionnis Сообщений: 5 Дата регистрации: 17.01.2005 |
А за советы большое спасибо GS писал(а):
Цитата: Ах если бы это зависело от меня, я бы так не парился конечно. Но наши чудо-программисты имеют свои взгляды на этот счёт, говорят что у них в Clipper'е что то будет конфликтовать если индексный файл будет иметь имя такое же как и dbf-таблица. |
Re: Алиас не найден ... | |
---|---|
Dionnis Сообщений: 5 Дата регистрации: 17.01.2005 |
Igor Korolyov писал(а):
Цитата: Hi, Игорь Королёв! Версия VFP OLE DB Provider'а номер 8. Конечно может быть и странная процедура, всё таки Fox, я вообще можно сказать не знаю, она была написана по советам знакомых, чтото на форумах советовали, гдето прочитал, вот и получилась такая сборная солянки. Но главное что она работала ... как оказалось не во всех случаях. Почему же она ничего не возвращает? Она данные помещает в курсор, а потом оттуда средставми Delphi я получаю этот набор данных. Вот и функция с помощью которой я это делаю: function CreateQueryARM(Connection: TADOConnection; SQL: WideString; const Params: array of const): TADODataSet; var Command:TADOCommand; begin Command := TADOCommand.Create(Application); Command.Connection := Connection; Command.CommandText := format(SQL, Params); // Здесь через переменную SQL я вызываю нужную ХП //Command.CommandTimeout := 3000; Command.Execute; Command.Free; result := CreateQuery(Connection, 'SELECT * FROM TmpDbf', []); end; То есть назначение процедуры : подключить индекс, для достижения большего быстродействия доступа к данным и соответственно получить эти данные. |
Re: Алиас не найден ... | |
---|---|
Igor Korolyov Автор Сообщений: 34580 Дата регистрации: 28.05.2002 |
Hi, Dionnis!
Ну вообще такая схема меня как-то смущает - в одной ХП ты создаешь курсор, в другом месте - выборку из него делаешь О чём я собственно и сказал... Всё-же лучше это сделать в одной процедуре, а полученный результат (курсор) перегнать в XML (банальным CURSORTOXML()) и получить на клиенте. Тогда явно можно закрыть всё использованное по завершении ХП. Кстати проблема возникает в самой ХП, или во втором запросе? Если во втором запросе, то явно не в коде ошибка, а в использованном ПОДХОДЕ... Как вариант (если есть собственно фокс) можно нарисовать COM сервер на фоксе, который будет делать то-же самое, и так-же возвращать данные в виде XML строки, или ещё каком-то - в COM меньше ограничений чем в OLE DB провайдере, да и как-то это лучше вписывается в многозвенку Если понадобиться работать с удалёнными данными (т.е. на другой машине), то поместив COM сервер в COM+ приложение на этой маг\шине мы получим существеннейший прирост в скорости - ибо фоксу не придётся гонять данные по сети (OLE DB всё равно вынимает здоровый кусок индекса, и собственно данные из dbf - т.к. "исполняется" всё на той машине где создан Connection - COM+ же исполняет код на той машине где зарегистрирован COM сервер). ------------------ WBR, Igor |
© 2000-2024 Fox Club  |