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

C# 如何使用ODAC连接到oracle数据库#,c#,oracle,odac,C#,Oracle,Odac,我正在使用这段代码,但在con.open()处出现错误“对象引用未设置为对象的实例”?我做错了什么 我已经下载并安装了ODAC组件版本10、11、12,并在最新版本失败时尝试了每一个版本,但仍然存在相同的错误 using Oracle.DataAccess.Client; namespace WindowsFormsApplication1 { class OraTest { public OracleConnection con = new OracleC

我正在使用这段代码,但在con.open()处出现错误“对象引用未设置为对象的实例”?我做错了什么

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

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块,则可以捕获错误

例如:

我添加了try-catch块,它返回ORA12154-TNS无法返回 解决。经过一些研究,我在tnsnames.ora中添加了一个SID 我的ODP for.NET Oracle主路径中的文件,它运行正常

有关Oracle客户端(如您的C#程序)可能出现的连接问题的疑难解答,请参见

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

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

其他建议:

  • 重读

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

  • 关注连接字符串。如果可能的话,在OracleConnection()构造函数中指定连接字符串不会有什么坏处。下面是另一个链接:

  • 如果您可以验证PC与C#/.Net程序之外的其他Oracle客户端的连接,这将非常好。为了验证您正在使用正确的用户名/密码与正确的TNS主机和服务进行通信。例如,您可能有SQLDeveloper或sqlplus

  • 最后,重新阅读TNS疑难解答链接:


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

例如:

我添加了try-catch块,它返回ORA12154-TNS无法返回 经过一些研究,我在tnsnames.ora中添加了一个SID 我的ODP for.NET Oracle主路径中的文件,它运行正常

有关Oracle客户端(如您的C#程序)可能出现的连接问题的疑难解答,请参见

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

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

其他建议:

  • 重读

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

  • 关注连接字符串。如果可能的话,在OracleConnection()构造函数中指定连接字符串不会有什么坏处。下面是另一个链接:

  • 如果您可以验证PC与C#/.Net程序之外的其他Oracle客户端的连接,这将非常好。为了验证您正在使用正确的用户名/密码与正确的TNS主机和服务进行通信。例如,您可能有SQLDeveloper或sqlplus

  • 最后,重新阅读TNS疑难解答链接:


请浏览此链接

使用Oracle.NET数据提供程序(C#版本)入门


请浏览此链接

使用Oracle.NET数据提供程序(C#版本)入门


对于我来说,发生同样错误的原因是简单地从“普通”Oracle DataAccess库切换到“托管”版本。 这是一个非常容易做出的改变-

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

    using Oracle.ManagedDataAccess.Client;
    using Oracle.ManagedDataAccess.Types;
    
  • Oracle.ManagedDataAccess.dll
    文件与exe一起包括在内


  • 对于我来说,在同样的错误下,简单地从“普通”Oracle DataAccess库切换到“托管”版本是有效的。 这是一个非常容易做出的改变-

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

    using Oracle.ManagedDataAccess.Client;
    using Oracle.ManagedDataAccess.Types;
    
  • Oracle.ManagedDataAccess.dll
    文件与exe一起包括在内


  • try-catch不起作用,错误以相同的方式围绕调试模式突出显示行Q:您在try/catch中获得的异常对象中是否查找任何内部异常?另外:我更新了我的帖子,其中包含一个捕获OracleException对象的MSDN示例。内部异常为我提供了以下“System.NullReferenceException:object refe”rence未设置为对象的实例。位于Oracle.DataAccess.Client.OracleConnection.Open()'对于您的exception示例,其相同的消息caughtWorked,我必须删除引用并添加旧版本的引用!,感谢各位的回复,efforttry catch不起作用,错误以相同的方式围绕调试模式抛出,突出显示行问:您在try/c中获得的异常对象中是否查找任何内部异常atch?另外:我更新了我的帖子,其中有一个捕捉OracleException对象的MSDN示例。内部异常为我提供了“System.NullReferenceException:对象引用未设置为对象的实例。位于Oracle.DataAccess.Client.OracleConnection.Open()“对于您的Exception示例,它的相同消息caughtWorked,我必须删除引用并添加旧版本的引用!感谢各位的回复和努力您安装了Oracle客户端吗?您安装了Oracle客户端吗?