ODAC и C# - TNS: время ожидания подключения истекло - подключение только через отладчик VS2005

Я новичок в Oracle, и у меня возникла проблема. Когда я запускаю приложение из IDE — Visual Studio 2005, соединение с базой данных устанавливается плавно, но когда я запускаю установленную версию приложения, соединение с БД завершается сбоем, и я получаю сообщение TNS: Ошибка тайм-аута подключения.

Я пытался использовать SQLNET.ORA и аналогичные решения, найденные в Интернете, но не смог решить проблему. Интересно, почему так происходит, ведь приложение, работающее через IDE и через установку, находится на одном и том же ПК. Я убедился, что файл TNSNAMES.ORA правильно отредактирован, и я могу подключиться через экземпляр приложения, работающего непосредственно в Visual Studio.

public bool connectToDatabase(string dbConnStr)
{
    try
    {
        databaseConnection = dbConnStr;
        OracleConnection dbConn = new OracleConnection(databaseConnection);
        if (dbConn == null)
        {
            CreateDLLLogFiles.ErrorLog(CreateDLLLogFiles.FileName, "Connection object is null");
            return false;
        }
        if (dbConn.State.ToString().Equals("Closed", StringComparison.OrdinalIgnoreCase))
        {
            CreateDLLLogFiles.ErrorLog(CreateDLLLogFiles.FileName, "DB connection - " + dbConn.ConnectionString);
            dbConn.Open();
            return true;
        }
    }
    catch (Exception ex)
    {
        CreateDLLLogFiles.ErrorLog(CreateDLLLogFiles.FileName, ex.Message + "\n" + ex.StackTrace);
        CreateDLLLogFiles.ErrorLog(CreateDLLLogFiles.FileName, "DB String - " + databaseConnection);

        return false;
    }
    return false;
}

Трассировка стека выглядит так:

7/22/2010 6:38:51 PM    ORA-12170: TNS:Connect timeout occurred
   at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
   at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src)
   at Oracle.DataAccess.Client.OracleConnection.Open()
   at SQL.connectToDatabase(String dbConnStr)

tnsnames.ora выглядит примерно так:

MySource =
  (DESCRIPTION =
    (CONNECT_TIMEOUT=180)(RETRY_COUNT=2)
    (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 125.63.77.232)(PORT = 1521)))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = MySource )
    )
  )

Тем временем отладчик выдал ошибку ContextSwitchDeadlock, поэтому я последовал инструкциям и изменил атрибут с STAThread на MTAThread в Main(). Нет больше ContextSwitchDeadlock - и тем не менее проблема с подключением сохраняется.

Я надеялся, что вы сможете пролить свет на этот вопрос - я близок к тому, чтобы вырвать себе волосы. Любое понимание будет оценено.


person Sreedevi J    schedule 21.07.2010    source источник
comment
Убедились ли вы, что ваше приложение (при установке) имеет по крайней мере Read прав на различные файлы клиента Oracle и что виртуализация файлов/реестров не мешает? Вы также убедились, что брандмауэр не блокирует исходящий трафик на порту, на котором работает служба Oracle?   -  person slugster    schedule 21.07.2010
comment
Да, у него есть доступ для чтения; брандмауэр тоже не блокирует порты. Если бы это проверили первым делом. Мне все еще интересно, почему это работает только при работе в среде IDE VS2005 - в этот момент приложение работает как шарм.   -  person Sreedevi J    schedule 21.07.2010
comment
Кроме того, если я использую SQLNET.ORA, я получаю ошибку сбоя записи пакета, и ему не удается подключиться из обоих экземпляров - отладчика и установленного. Предлагает ли это какие-либо подсказки? Пока я не использую файл SQLNET.ORA.   -  person Sreedevi J    schedule 22.07.2010


Ответы (1)


Проблема была решена. Всем большое спасибо за помощь! :) Оказалось, что это комбинация поврежденных библиотек ODAC, а затем и некоторых других.

person Sreedevi J    schedule 23.07.2010