Ошибка при попытке подключения к базе данных Oracle 10g из программы на C #, использующей минимальную конфигурацию настройки - PullRequest
8 голосов
/ 22 декабря 2011

При попытке подключиться к удаленной базе данных Oracle 10g из разрабатываемого приложения C # 2008 Express Edition возникает ошибка.Я пытаюсь использовать минималистский, ненавязчивый подход к разработке с целью развертывания ClickOnce на пользовательских рабочих станциях.

В отношении вышеизложенного я исследовал следующие документы (среди прочих ..)-

Какая минимальная настройка требуется для развертывания приложения .NET с клиентом Oracle 11?

http://jeremybranham.wordpress.com/2011/04/25/oracle-instant-client-with-odp-net/

http://ora -00001.blogspot.com / 2010/01 / odpnet-minimal-non-intrusive-install.html

http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c

Подключитесь к Oracle с помощью odp.net и OCI из C #

Из-за возникшей ошибки я создал простое тестовое приложение.состоящий из одной (wpf) страницы с одной кнопкой.В событии нажатия кнопки я пытаюсь создать соединение с базой данных Oracle -

private void button1_Click( object sender, RoutedEventArgs e )
{
    OracleConnection oraConnect;

    // string previously used OK in other projects
    string connectionString = "Data Source=" +
           "(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = myServer)(PORT = 1521)))" +
           "(CONNECT_DATA =(SERVICE_NAME = myOracleDb)))" +
           ";Password=myPw;User ID=myID;";

    using ( oraConnect = new OracleConnection( connectionString ) )
    {
        try
        {
            if ( oraConnect.State == ConnectionState.Closed )
            {
                oraConnect.Open();
                MessageBox.Show( "oraConnect is attempting to open.." );
            }
            else
                MessageBox.Show( "oraConnect open to DB: " + oraConnect.ServerVersion.ToString() );
        }
        catch ( NullReferenceException nullExcept )
        {
            MessageBox.Show( "Caught error: ." + nullExcept.ToString() );
        }
        catch ( OracleException dbEx )
        {
            MessageBox.Show( "OraException - " + dbEx.Message.ToString());
        }
        catch ( Exception ex )
        {
            Exception current;
            current = ex;

            while ( current != null )
            {
                current = current.InnerException;
            }

            MessageBox.Show( "Db base exception - " + ex.GetBaseException().ToString() );
        }
        finally
        {
            oraConnect.Close();
        }
    }
}

Следуя информации в вышеприведенных статьях, я убедился, что следующие DLL находятся в моей папке "bin"-

• oci.dll
• ociw32.dll
• orannzsbb10.dll
• oraocci10.dll
• oraociicus.dll
• msvcr71.dll

(последний назван в отчаянии ...) и ссылается на 'Oracle.DataAccess.dll'.

Сообщение об ошибке (при 'catch (OracleException dbEx)') -

"Oracle.DataAccess.Client.OracleException was caught
  Message=""
  StackTrace:
       at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure)
       at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src)
       at Oracle.DataAccess.Client.OracleConnection.Open()
       at OracleConnectionTest.Window1.button1_Click(Object sender, RoutedEventArgs e) in C:\Documents\Visual Studio 2008\Projects\OracleConnectionTest\OracleConnectionTest\Window1.xaml.cs:line 69
  InnerException: "

Line 69 is 'oraConnect.Open();'.

Кроме того, сообщается следующее:

"((Oracle.DataAccess.Client.OracleException)($exception)).DataSource' threw an exception of type 'System.NullReferenceException".

Я предполагаю из NullReferenceException в источнике данных, что проблема заключается в одной из библиотек dll ((), поскольку я «создаю» OracleConnectionвыше, прежде чем пытаться ссылаться на него.

Кроме того, выполнение кода переходит к 'catch (NullReferenceException nullExcept)' и переходит прямо к улову OracleException.

Извините за бессвязное, но надеюсь, что это делаетсмысл?Любая помощь / совет приветствуется!

Ответы [ 3 ]

2 голосов
/ 04 декабря 2013

ОК, очень поздно возвращаться к этому, за что много извинений!

Тем временем наша БД была обновлена ​​(!) И в список dll добавлен -

  • oraocci11.dll
  • oraociccus11.dll
  • OraOps11w.dll
  • orannzsbb1.dll

из версий '10', все еще сбезуспешно, я отредактировал App.xaml (после обширного поиска здесь и в Интернете) со следующим -

    <system.data>
      <DbProviderFactories>
         <add name="OracleClient Data Provider"
              invariant="System.Data.OracleClient"
              description=".Net Framework Data Provider for Oracle"
              type="System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=##################"/>
      </DbProviderFactories>
   </system.data>

   <!-- publicKeyToken obtained using Reflector to investigate dll -->
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="Oracle.DataAccess"
                              publicKeyToken="##################"
                              culture="neutral"/>
            <bindingRedirect oldVersion="10.2.0.100" 
                             newVersion="2.112.2.0"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>

bindingRedirect добился цели!

Кажется, что dll чрезвычайно зависит от совместимых номеров версий

Хотелось бы сказать, что я действительно понял как это работает, но работает, и у меня теперь есть рабочие соединения ...

1 голос
/ 23 мая 2012

Это случилось со мной.

После небольшого количества вуду, я удалил этот ключ из моего реестра: HKEY_CURRENT_USER\Software\ORACLE и все снова заработало.

0 голосов
/ 22 декабря 2011

Убедитесь, что ODAC настроен правильно.Я бы предложил использовать TNSNAMES (у вас не должно быть всей этой информации в строке подключения imo).См. Раздел TNSNAMES setup этого документа (11.2).Также смотрите нижний раздел для общих проблем с подключением

Как только это будет сделано, это должно быть так же просто, как поместить строку подключения в свойство settings вашего проекта и выполнить:

oraConnect = new OracleConnection(Properties.Settings.Default.MyConnString);

В вашем примереваш oraConnect не был создан (у вас просто есть «OracleConnection oraConnect»), поэтому «новая часть OracleConnection», которая не работает, приводит к исключению нулевой ссылки (если я все равно понимаю ваше объяснение, где оно нарушается).Отладчик в VS также должен помочь;)

РЕДАКТИРОВАТЬ: Вы можете настроить простое приложение консоли тестирования с просто открыть / закрыть соединение.Это может устранить любой шум, кроме правильной настройки вашего ODAC.Что-то вроде (не проверено, предположим настройку tnsnames):

с использованием ...

namespace Testbed {
  class Program {
    static void Main(string[] args) {
      try {
        string connStr="User Id=my_user;Password=my_pass;Data Source=my_sid;";
        OracleConnection oraConnect = new OracleConnection(connStr);
        oraConnect.Open();
        Console.WriteLine("Opened Connection");
        oraConnect.Close();
        Console.WriteLine("Complete");
        Console.ReadLine();
      catch (System.Exception e) {
        Console.WriteLine(e.Message);
        Console.ReadLine();
      } ...

Попробуйте запустить это и сообщить, что возвращается из консоли.

...