Привожу свои исходники решения этой проблемы, может кому интересно
//делаем запрос в удаленную БД
function OraQuery(const sTableNames, sSubFields, sWhereClause: String): IName;
var
cursor: HICON;
pWorkspace: IWorkspace;
pQueryDef: IQueryDef;
pTableQueryName: IQueryName2;
pWorkspaceName: IName;
bCopyLocally: WordBool;
begin
cursor:=SetCursor(LoadCursor(HInstance, 'SQLGlass'));
try
//Создаем Workspace
pWorkspace:=GetOracleWorkspace; //- см. ниже
(pWorkspace as IFeatureWorkspace).CreateQueryDef(pQueryDef);
pQueryDef.Set_Tables(sTableNames);
pQueryDef.Set_SubFields(sSubFields);
pQueryDef.Set_WhereClause(sWhereClause);
pTableQueryName:=(CoTableQueryName.Create as IQueryName2);
pTableQueryName.Set_QueryDef(pQueryDef);
bCopyLocally := boolReadIni('CommonOptions', 'CopyLocaly');
pTableQueryName.Set_CopyLocally(bCopyLocally);
//pTableQueryName.Set_PrimaryKey(sTableKeyFieldName);не устанавливать иначе тормозит!!!
(pWorkspace as IDataset).Get_FullName(pWorkspaceName);
with (pTableQueryName as IDatasetName) do
begin
_Set_WorkspaceName(pWorkspaceName as IWorkspaceName);//строка обязательна!
Set_Name('TmpQuery'+IntToStr(Random(9999)))//эта тоже
end;
Result:=(pTableQueryName as IName);
{Result.Open(pT); - получаем искомую ссылку на закешированный на диске результат SQL запроса
pStandaloneTable:=(CoStandaloneTable.Create as IStandaloneTable);
pStandaloneTable._Set_Table(pT as ITable);
(pApp.Document as IMxDocument).Get_FocusMap(pMap);
(pMap as IStandaloneTableCollection).AddStandaloneTable(pStandaloneTa ble);
(pApp.Document as IMxDocument).UpdateContents;}
except
on E: EAbort do Abort;
on E: Exception do
begin
raise EGisException.CreateError(E, 'Ошибка при создании запроса в Оракл!'+#13#10+E.Message, 0, 'un_GisPipeline_DBFunc', 'OraQuery');
end
end;
pWorkspace := nil;
SetCursor(Cursor);
end;
//устанавливаем соединение с оракловой БД
function GetOracleWorkspace: IWorkspace;
var
pOLEDBWorkspaceFactory: IWorkspaceFactory;
pOraConProp: IPropertySet;
begin
pOraConProp := MadeOracleConnectionProp; //- смысл - выдает диалог, запрашивающий имя и пароль и записывает их в специальную структуру IPropertySet
try
pOLEDBWorkspaceFactory:=(CoOLEDBWorkspaceFactory.Create as IWorkspaceFactory);
pOLEDBWorkspaceFactory.Open(pOraConProp, 0, Result);
pOLEDBWorkspaceFactory:=nil;
except
on E: Exception do
begin
ErrorHandler(E, E.Message, 0, 'un_GISPipeline_DBFunc', 'GetOracleWorkspace');
pOraConProp:=nil;
end
end;
if Result = nil then
begin
pOraConProp:=nil;
MessageBox(Application.Handle, PAnsiChar('Не удалось установить соединение с Ораклом!'+#13#10+'Возможно введены неправильные имя пользователя и пароль или сервер временно не доступен!'), 'Внимание!', MB_OK+MB_ICONWARNING);
raise EExitException.Create('');
end;
end;