尝试从采用最小设置配置的C#程序连接到Oracle 10g数据库时出错

问题描述:

我尝试从正在开发的C#2008速成版应用程序连接到远程Oracle 10g数据库时遇到错误。我试图在开发中使用极简主义的非侵入式方法,以便将ClickOnce部署到用户工作站。尝试从采用最小设置配置的C#程序连接到Oracle 10g数据库时出错

就上述调查过下列文件(除其他..) -

What is the minimal setup required to deploy a .NET application with Oracle client 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

Connect to Oracle with odp.net and the OCI from 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'。

(在 '赶上(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 catch。

对不起,但希望这是有道理的? 任何帮助/建议表示赞赏!

+0

你能ping'myServer'?你尝试通过sqlplus连接吗? – V4Vendetta 2011-12-22 12:34:58

+0

你可以t''myOracleDb'吗? – Shai 2011-12-22 12:45:20

+0

'NullReferenceException'不是问题的原因。它发生在您检查VisualStudio中的异常时。这是一个调试工件,可以忽略。不幸的是,真正的异常似乎不包含任何错误信息。或者你在某处忽略了它? – Codo 2011-12-22 12:48:44

确保ODAC设置正确。我会建议使用TNSNAMES(你不应该有连接字符串IMO中的所有信息)。请参阅本文档的TNSNAMES setup部分(11.2)。也看到了通用连接底部发出

一旦这样做了,就应该尽可能把你的连接字符串中项目的设置属性,做一样简单:

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(); 
     } ... 

试运行和报告从什么控制台回来。

+0

'oraConnect'已经被实例化。在使用(oraConnect = new OracleConnection ...)中查看'new'关键字 – Codo 2011-12-22 14:01:56

+0

并不清楚这是从OP – tbone 2011-12-22 14:23:42

它发生在我身上。

经过一段伏都教之后,我从我的注册表中删除了这个密钥:HKEY_CURRENT_USER\Software\ORACLE,一切正常。

好的,很晚才回到这很多道歉!

在此期间,我们的数据库已经升级,并在不断变化的DLL列表包括:(!) -

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

从'10'版本,仍然没有成功,我编辑了App.xaml(在这里和在网上广泛搜索)wi th以下 -

<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

中完全失败的位置_该dll似乎非常依赖于兼容的版本号_这个。 EXTREMELY touchy,我已经让整个服务器在XX1/XX2版本不匹配的情况下纾困。这将是我的调试建议,我很高兴这个问题得到解决。你应该接受你自己的答案,以便其他人可以找到答案。 – 2015-08-06 13:20:29