Delphi и Oracle
Из всех процессов в Панель управления\Администрование\Службы оставлено на автозапуске только три:
OracleMTSRecoveryService, OracleOraHome92TNSListener и OracleServicePROBASAX.
С помощью Enterprise Manager Console из-под пользователя System создан новый пользователь с именем Usersax.
Все настройки пользователя повторяют настройки пользователя Scott созданного при установке автоматически.
В распроряжении пользователя Usersax одна таблица с именем FTable. Эта таблица содержит три столбца с именами A, B и C.
Записей в таблице нет.
В Delphi создано обычное приложение с одной формой. Все настройки по умолчанию.
На форме размещено по одному компоненту DBGrid, DataSource, ADOTable.
В свойстве TableName компонета ADOTable выбрана таблица FTable.
Строка ConnectionString компонента ADOTable содержит следующее:
Provider=OraOLEDB.Oracle.1;Password=sax3;Persist Security Info=True;User ID=Usersax;Data Source=PROBASAX.
То есть драйвер используется Oracle Provider for OLE DB. В настроках установлен checkbox - разрешить сохранение пароля.
При нажатии кнопки "Проверить подключение" появляется сообщение "Проверка подключения выполнена".
При установке свойства Active компонента ADOTable в положение True в компоненте DBGrid повляются три пустых столбца
с именами A, B и C.
При попытке откомпилировать программу выдаётся сообщение:
ORA-12154: TNS:невозможно разрешить имя службы.
В чём причина? Разобраться сам не могу - только начинаю работать с Oracle.
Откомпилировать?? Это что-то новенькое. Ты что, её прямо на сервер компилишь? :rolleyes:
Через что идёт подключение клиента: TCP, pipes, IPC? Какие способы именования установлены и в каком порядке? Как называется соответствующий "базе" сервис в $(ORACLE_HOME)\network\admin\tnsnames.ora?
# TNSNAMES.ORA Network Configuration File: D:\oracle\ora92\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.
INST1_HTTP =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 12-4666b460d102)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = SHARED)
(SERVICE_NAME = MODOSE)
(PRESENTATION = http://HRService)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(Key = EXTPROC0))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
PROBASAX =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 12-4666b460d102)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = probasax.com)
)
)
PROBASAX =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 12-4666b460d102)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = probasax.com)
)
)
Ни фига себе название хоста! Оно реально такое? Может ли подключиться SQL*Plus по имени (connection string) probasax?
Имя пользователя - usersax
Пароль - ****
Строка связи - probasax
Появляется сообщение -
Присоединён к:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
Имя хоста - это полное имя домашнего компьютера, все настройки создались сами при установке, я там ничего не менял.
При нажатии кнопки "Проверить подключение" появляется сообщение "Проверка подключения выполнена".
При установке свойства Active компонента ADOTable в положение True в компоненте DBGrid повляются три пустых столбца
с именами A, B и C.
При попытке откомпилировать программу выдаётся сообщение:
ORA-12154: TNS:невозможно разрешить имя службы.
В чём причина? Разобраться сам не могу - только начинаю работать с Oracle.
Скорее всего Oracle тут ни при чем. Видимо у тебя чем-то убивается строка связи. Соединение по указаной строке у тебя явно происходит, иначе не получилось бы считать описание таблицы в TADOTable.
в файле D:\oracle\ora92\network\log\nmiconf.log много ошибок:
"
DBSNMP for 32-bit Windows: release 9.2.0.0.0 - Production on 07-APR-07 14:12:57
Discovering services on 12-4666b460d102 configured on host addresses {12-4666b460d102 127.0.0.1}
Warning : Error while sourcing third party discovery file emddiscover.tcl : unable to get value "em_loc" from key "HKEY_LOCAL_MACHINE\Software\Oracle": Не удается найти указанный файл.
"
в файле D:\oracle\ora92\network\log\dbsnmp.log много таких ошибок:
"
DBSNMP for 32-bit Windows: Version 9.2.0.1.0 - Production on 15-АПР-2007 17:11:40
Copyright (c) 2002 Oracle Corporation. All rights reserved.
файлом системных параметров является D:\oracle\ora92\network\admin\snmp_ro.ora
сообщения протокола записаны в D:\oracle\ora92\network\log\dbsnmp.log
информация протокола записана в D:\oracle\ora92\network\trace\dbsnmp_2396.trc
текущим уровнем протокола является 0
NMS-00001: Предупреждение: dbsnmp не может соединиться с мастер-агентом SNMP
"
Производились неоднократные установки различных версий (Enterprise Edition, Standard Edition, Perosonal Edition), что не приводило к корректной работе Delphi и Oracle.
При попытке подсоединения к таблице через ADOTable c помощью драйвера Oracle Provider for OLE DB при компилировании программы (Run(F9)) выдавалась ошибка "ORA-12154 TNS:невозможно разрешить имя службы".
При попытке подсоединения к таблице через ADOTable c помощью драйвера Microsoft OLE DB Provider for Oracle при компилировании программы (Run(F9)) выдавалась ошибка "ORA-06413 соедиение не уставлено" (номер такой, а текст ошибки точно не помню).
При попытке подсоединения к таблице через Oracle Data Access Components 5.80.0.35 Net Trial for Delphi 7 с помощью компонент OraSession, OraTable или OraQuery выдавалась ошибка "ORA-06413 соедиение не уставлено".
Была установлена бесплатно распространяемая СУБД "Oracle Database 10g Express Edition" - 206 Мегабайт.
Ошибки аналогичны тем, что и при работе с версией Oracle 9i (9.2.0.1.0).
Произведена переустановка с форматированием Win XP SP2 rus, Oracle 9i (9.2.0.1.0) Enterprise Edition и Borland Delphi 7 Enterprise.
Все настройки стандартные.
Соединение Delphi и Oracle с помощью ADOTable и драйвера Oracle Provider for OLE DB выдает Delphi ошибку "Invalid variant operation".
Соединение Delphi и Oracle с помощью ADOTable и драйвера Microsoft OLE DB Provider for Oracle проходит успешно.
Отличия первого варианта от нового:
- отсутствует DrWeb 4.33.2.12251
- отсутствуют дополнения
WindowsXP-KB884020-x86-rus
WindowsXP-KB911280-v2-x86-RUS
WindowsXP-KB914388-x86-RUS
WindowsXP-KB914389-x86-RUS
WindowsXP-KB917159-x86-RUS
WindowsXP-KB917422-x86-RUS
WindowsXP-KB917953-x86-RUS
WindowsXP-KB920214-x86-RUS
WindowsXP-KB920670-x86-RUS
WindowsXP-KB920683-x86-RUS
WindowsXP-KB921398-x86-RUS
WindowsXP-KB921883-x86-RUS
WindowsXP-KB922616-x86-RUS
- при уставноке использовалась классическая тема формления Windows
- установка прошла не за 60 минут как ранее, а за 20.
- установка прошла не за 60 минут как ранее, а за 20.
К доктору! А если серьёзно:
- В разработке приложения под сервер стоимостью n тонн зелени глупо экономить несколько сотен на компонентах прямого доступа, вроде ODAC. На микрочленовском ADO под Oracle будут писать только больные, если только не стоит задача приложения, "независимого" от базы. Если такая задача стоит, настоятельно посоветовать руководству нанять специалистов соответствующего уровня - дешевле выйдет.
- При установке сервера Oracle, особенно Enterprise версии, для простой разработки "под Oracle", полезно большую часть фич отключить. Мы в своё время оставляли только Oracle RDBMS и Oracle Net Services - этого достаточно.
А компоненты используются Oracle Data Access Components 5.80.0.35 Net Trial for Delphi 7.
Так вы, батенька, определитесь-таки, ADO или ODAC: раньше про ADO речь шла, а теперь ODAC вдруг вылез. Возвращаясь к первоначальному вопросу: в OraSession.Options достаточно включить NeverConnect, если правильно понял.
Активировать сессию лучше из кода программы, а ещё лучше расположить все компоненты доступа к данным на TDataModule и на его OnCreate повесить код вида:
function TDmOra.FormCreate(Sender:TObject);
begin
if not osMySession.Connected then
begin
try
osMySession.Connect;
except
on E:EOraError do
begin
{код обработки ошибки соединения, вплоть до закрытия приложения}
end;
end;
end;
end;
Все остальные компоненты лучше активировать после соединения.