Не удается подключиться к Oracle из службы Windows (ошибка: ORA-12154: TNS: не удалось разрешить имя службы (12154)) - PullRequest
6 голосов
/ 26 августа 2011

ПОСЛЕДНЕЕ обновление (2 ноября 2011 г., 9:00) Я попытался запустить tnsping из сервиса, и он РАБОТАЕТ!Однако я все еще получаю ошибку 12154, когда я пытаюсь подключиться.Теперь я полностью сбит с толку, я не могу понять, как tnsping может работать нормально, но соединение не может разрешить имя службы.

По какой-то причине, когда я запускаю следующий код из службы Windows (насобытие таймера) Я получаю сообщение об ошибке: ORA-12154: TNS: не удалось разрешить имя службы (12154)

Когда я запускаю точно такой же код из приложения Windows Form, он подключается очень хорошо.И служба, и приложение работают под моей учетной записью, поэтому нет разницы в разрешениях учетной записи.
Я озадачен тем, почему служба не работает, может кто-нибудь пролить свет на это, пожалуйста?

string connectionString =     ";DSN=o1;UID=SCOTT;PWD=TIGER;DBQ=ORCL;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=F;BAM=IfAllSuccessful;MTS=F;MDI=F;CSR=F;FWC=F;PFC=10;TLO=0;";
        OdbcConnection cnn;
        cnn = new OdbcConnection(connectionString);
        try
        {
            cnn.Open();
            myEventLog.WriteEntry("Connection SUCCEEDED!!!");
            cnn.Close();
        }
        catch (Exception ex)
        {
            string mes = "Connection FAILED!!!" + ex.Message;
            myEventLog.WriteEntry(mes);
        }

Обновления:

1) Я пробовал как с системным, так и с пользовательским dsn, оба имеют одинаковое поведение

2) Я добавил TNS_ADMIN к системным переменным среды, чтобы сделать sueон может найти файл tnsnames.ora.Это не изменило поведение.

Новые обновления (1 ноября 2011 г.):

1) Многие предложения касались помещения IP-адреса сервера Oracle в строку подключения для обхода.файл tnsnames.ora.К сожалению, приложение должно работать с установленным пользователем соединением оракула, поэтому у нас нет этой информации.Все, с чем мне нужно работать, это DSN.Мне нужно подключить его из службы Windows с помощью Oracle DSN.

Новые обновления (2 ноября 2011 г.): 1) Похоже, служба успешно читает файл tnsnames.ora.Я запустил монитор процесса и получил следующие строки:

7:52:54.4365217 AM  OracleService.exe   4624    CreateFile          C:\oracle\ora92\network\Names\sdns.ora  NAME NOT FOUND  Desired Access: Generic Read, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: n/a
7:52:54.4368466 AM  OracleService.exe   4624    CreateFile  C:\Windows\SysWOW64\tnsnames.ora    NAME NOT FOUND  Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a
7:52:54.4371203 AM  OracleService.exe   4624    CreateFile  C:\oracle\ora92\network\ADMIN\tnsnames.ora  SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
7:52:54.4372693 AM  OracleService.exe   4624    QueryBasicInformationFile   C:\oracle\ora92\network\ADMIN\tnsnames.ora  SUCCESS CreationTime: 01/11/2011 3:10:08 PM, LastAccessTime: 01/11/2011 3:10:08 PM, LastWriteTime: 01/11/2011 3:10:42 PM, ChangeTime: 01/11/2011 3:18:44 PM, FileAttributes: A
7:52:54.4372866 AM  OracleService.exe   4624    CloseFile   C:\oracle\ora92\network\ADMIN\tnsnames.ora  SUCCESS 
7:52:54.4375418 AM  OracleService.exe   4624    CreateFile  C:\oracle\ora92\network\ADMIN   SUCCESS Desired Access: Read Data/List Directory, Synchronize, Disposition: Open, Options: Directory, Synchronous IO Non-Alert, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
7:52:54.4375857 AM  OracleService.exe   4624    QueryDirectory  C:\oracle\ora92\network\ADMIN\tnsnames.ora  SUCCESS Filter: tnsnames.ora, 1: tnsnames.ora
7:52:54.4376192 AM  OracleService.exe   4624    CloseFile   C:\oracle\ora92\network\ADMIN   SUCCESS 
7:52:54.4377770 AM  OracleService.exe   4624    CreateFile  C:\oracle\ora92\network\ADMIN\tnsnames.ora  SUCCESS Desired Access: Generic Read, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: n/a, OpenResult: Opened
7:52:54.4379306 AM  OracleService.exe   4624    ReadFile    C:\oracle\ora92\network\ADMIN\tnsnames.ora  SUCCESS Offset: 0, Length: 337, Priority: Normal
7:52:54.4380061 AM  OracleService.exe   4624    ReadFile    C:\oracle\ora92\network\ADMIN\tnsnames.ora  END OF FILE Offset: 337, Length: 4,096
7:52:54.4380276 AM  OracleService.exe   4624    CloseFile   C:\oracle\ora92\network\ADMIN\tnsnames.ora  SUCCESS 
7:52:54.4385823 AM  OracleService.exe   4624    CreateFile  C:\oracle\ora92\network\ADMIN\ldap.ora  NAME NOT FOUND  Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a

Так есть ли у кого-нибудь идеи, почему он может перестать работать после чтения файла tnsnames.ora?Спасибо

Ответы [ 7 ]

6 голосов
/ 31 октября 2011

Переменные среды, определенные в соответствующем диалоговом окне, недоступны службам Windows.Одна вещь, которую вы можете попробовать - это расширить строку подключения, как описано в этом посте .Другие предложения из того же поста могут быть применимы.

2 голосов
/ 27 августа 2011

Вероятно, он не находит файл tnsnames.ora. Убедитесь, что при запуске службы установлены одинаковые переменные среды.

0 голосов
/ 19 июля 2012

Убедитесь, что в определении имени TNS нет пробелов перед именем в tnsnames.ora

0 голосов
/ 17 февраля 2012

Я исправил проблему.

в пароле моей базы данных был символ '@'. После того, как я изменил пароль и удалил этот символ, проблема была исправлена ​​и операция экспорта успешно завершена.

Эта ссылка помогла в решении проблемы.

0 голосов
/ 02 ноября 2011

Хорошо, я собираюсь ответить на свой вопрос здесь, просто чтобы отделить окончательное решение от полезных предложений, которые привели меня к нему. На пост, на который ссылается Никола), как только я внимательно его прочитал), получился ответ. Мой сервис работал из Program Files (x86), и драйвер oracle НЕ МОЖЕТ обработать () путь к вызывающему приложению.
Я переместил свой сервис в D: \ ServiceTest, и он работает нормально. Моя проблема сейчас в том, что я не думаю, что наше приложение может быть перемещено из Program Files (x86).
Спасибо всем за вашу помощь, я ценю вклад каждого, но мне придется отдать награду Николаю, так как он указал мне на пост, содержащий ответ. Еще раз спасибо за вашу помощь

0 голосов
/ 02 ноября 2011

Джон С. Несколько вещей показались мне странными.Надеюсь, я не неправильно понял ваши ответы.

В строке подключения в одном из ответов вы получили сообщение об отсутствующем драйвере.Чтобы это исправить, вам нужно будет указать провайдера / драйвер, поскольку вы используете OdbcConnection, а не OracleConnection.OracleConnection, который будет использовать большинство людей, будет неявно указывать на драйвер.Я предполагаю, что вам нужно обслуживание для работы с базами данных, поэтому требуется OdbcConnection. веб-сайт дает множество примеров строк подключения, и я думаю, что вы должны найти что-то подходящее.

Я бы посоветовал вам попробовать

Driver = {Microsoft ODBC для Oracle} ; CONNECTSTRING = (ОПИСАНИЕ = (АДРЕС = (PROTOCOL = TCP) (ХОСТ)= сервер) (PORT = 7001)) (CONNECT_DATA = (SERVICE_NAME = myDb))); Uid = myUsername; Pwd = myPassword;

Еще одним моментом было местоположение, на которое указала переменная TNS_ADMIN.Вы упомянули, что указали на OraHome.Я просто хотел подтвердить, что вы указали переменную на папку NETWORK \ ADMIN в OraHome.Я полагаю, вам придется указать на папку, в которой находится файл.

Наконец, я бы посоветовал вам попытаться извлечь некоторые параметры из строки подключения, которая есть в исходном посте.Это уменьшит переменные, которые могут повлиять на результат, упрощая отладку.И иметь переменную окружения, которая настраивается для пользователя в качестве системных переменных окружения.Возможно, причина, по которой вы запускаете приложение winforms, заключается в переменной, определенной для пользователя.Я подозреваю, что служба Windows может использовать только системные переменные.

Driver = {Oracle in OraHome92}; Server = myServerAddress; Dbq = myDataBase; Uid = myUsername; Pwd = myPassword;

0 голосов
/ 01 ноября 2011

Убедитесь, что у учетной записи службы есть разрешения на чтение файла tnsnames.ora. Также в sqlnet.ora попробуйте удалить NTS из SQLNET.AUTHENTICATION_SERVICES, если он там есть.

Если вы все еще испытываете трудности, попробуйте использовать ezconnect для обхода всех имен tns. например: //ip.of.server/sid

http://www.orafaq.com/wiki/EZCONNECT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...