繁体   English   中英

如何使用ODAC C#连接到Oracle数据库

[英]How to connect to oracle database with ODAC c#

我正在使用此代码,但收到“对象引用未设置为对象的实例”的错误。 在con.open()? 我究竟做错了什么 ?

我已经下载并安装了ODAC组件版本10、11、12,尝试在最新的ODAC组件版本失败的情况下尝试每个组件,但仍然出现相同的错误

using Oracle.DataAccess.Client;


namespace WindowsFormsApplication1
{
    class OraTest
    {

        public OracleConnection con = new OracleConnection();
        public void Connect()
        {
            con.ConnectionString = "Data Source=(DESCRIPTION= (ADDRESS = (PROTOCOL = TCP)(HOST =myip) (PORT = myport))(CONNECT_DATA = (SERVER = dedicated)(SERVICE_NAME = mydb)));User ID=myid;Password=mypass;";

            con.Open(); //error here

        }

        public void Close()
        {
            con.Close();
            con.Dispose();
        }


    }

如果在Connect()中添加try / catch块,则可以捕获该错误。

例如:

打开oracle连接时,连接对象为null

我添加了try catch块,它返回了ORA12154-TNS无法解析。 经过一番研究,我在ODP for .NET Oracle主目录的tnsnames.ora文件中添加了一个SID,它可以正常工作

另请参阅对Oracle Net Services进行故障排除,以对来自Oracle客户端(例如C#程序)的可能的连接问题进行故障排除。

但是,您的第一步绝对是确定Oracle级别的错误(例如,ORA-12543(无法连接到服务器主机)或TNS-12514(找不到服务名称)

MSDN:OracleException类

public void ShowOracleException() 
{
   OracleConnection myConnection =
      new OracleConnection("Data Source=Oracle8i;Integrated Security=yes");

   try 
   {
      myConnection.Open();
   }
   catch (OracleException e) 
   {
     string errorMessage = "Code: " + e.Code + "\n" +
                           "Message: " + e.Message;

     System.Diagnostics.EventLog log = new System.Diagnostics.EventLog();
     log.Source = "My Application";
     log.WriteEntry(errorMessage);
     Console.WriteLine("An exception occurred. Please contact your system administrator.");
   }
}

con.ConnectionString = xyz起作用很重要,但是以下的“ con.Open()”失败了,这意味着.Net正在创建C#对象,但是当您尝试使用它时,Oracle / TNS却失败了。

其他建议:

  • 重读

    打开oracle连接时,连接对象为null

    阅读所有建议,包括有关“连接字符串中的数据源”的建议。

  • 专注于您的连接字符串。 如果可能的话,在您的OracleConnection()构造函数中指定连接字符串也可以。 这是另一个链接:

    ODP.NET连接异常

  • 如果您可以验证PC与C#/。Net程序以外的其他 Oracle客户端之间的连接,那就太好了。 为了验证您正在使用正确的用户名/密码与正确的TNS主机和服务进行对话。 例如,也许您有SQLDeveloper或sqlplus。

  • 最后,重新阅读TNS故障排除链接:

    https://docs.oracle.com/cd/E11882_01/network.112/e41945/trouble.htm#NETAG016

对于我来说,出现相同错误的原因是,只需从“普通” Oracle DataAccess库切换到“托管”版本即可。 这是一项非常容易的更改-

  1. 在c#项目Oracle.ManagedDataAccess引用添加到Oracle.ManagedDataAccess
  2. 将Oracle客户端代码顶部的现有use语句替换为以下内容:

     using Oracle.ManagedDataAccess.Client; using Oracle.ManagedDataAccess.Types; 
  3. 包含exe的Oracle.ManagedDataAccess.dll文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM