Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 打开oracle连接时,连接对象为空_C#_.net_Oracle_Odp.net - Fatal编程技术网

C# 打开oracle连接时,连接对象为空

C# 打开oracle连接时,连接对象为空,c#,.net,oracle,odp.net,C#,.net,Oracle,Odp.net,我正在尝试连接到控制器中的oracle数据库: using Oracle.DataAccess.Client; using Oracle.DataAccess.Types; // Other code OracleConnection con; con = new OracleConnection(); con.ConnectionString = "DATA SOURCE=<DSOURCE_NAME>;PERSIST SECURITY INFO=True;USER

我正在尝试连接到控制器中的oracle数据库:

 using Oracle.DataAccess.Client;
 using Oracle.DataAccess.Types;

 // Other code

 OracleConnection con;
 con = new OracleConnection();

 con.ConnectionString = "DATA SOURCE=<DSOURCE_NAME>;PERSIST SECURITY INFO=True;USER ID=******;PASSWORD=*******";

 con.Open();

在open()调用周围添加一个try-catch块,并解决OracleException中显示的ORA错误。

我在开始使用ODP.NET时也遇到了同样的问题

您可以如下方式调整代码:

try
{
    OracleConnection con;
    con = new OracleConnection();

    con.ConnectionString = "DATA SOURCE=<DSOURCE_NAME>;PERSIST SECURITY INFO=True;USER ID=******;PASSWORD=*******";

    con.Open();
}
catch (OracleException ex)
{
    Console.WriteLine("Oracle Exception Message");
    Console.WriteLine("Exception Message: " + ex.Message);
    Console.WriteLine("Exception Source: " + ex.Source);
}
catch (Exception ex)
{
    Console.WriteLine("Exception Message");
    Console.WriteLine("Exception Message: " + ex.Message);
    Console.WriteLine("Exception Source: " + ex.Source);
}
试试看
{
oraclecon;
con=新的OracleConnection();
con.ConnectionString=“数据源=;持久安全信息=真;用户ID=*******;密码=*******”;
con.Open();
}
捕获(OracleException-ex)
{
Console.WriteLine(“Oracle异常消息”);
Console.WriteLine(“异常消息:+ex.Message”);
Console.WriteLine(“异常源:+ex.Source”);
}
捕获(例外情况除外)
{
Console.WriteLine(“异常消息”);
Console.WriteLine(“异常消息:+ex.Message”);
Console.WriteLine(“异常源:+ex.Source”);
}
您可以在此处获得有关错误的更多信息:

问题在于连接字符串中的
数据源。我假设它是这样的:
Data Source=Server.Source
,您可以在计算机上的
TNSNAMES.ORA
文件中找到它

问题是ODP.NET不像Visual Studio那样读取
TNSNAMES.ORA
文件

您有多种选择来解决此问题:

  • 编辑
    Web.Config
    App.Config
    文件,告诉ODP.NET如何处理源代码
  • TNSNAMES.ORA
    文件复制到与
    .exe
    相同的目录中。(如果不是web应用程序)
  • 更改
    数据源
    ,以编写长版本而不是别名。例如:
    数据源=(描述=(地址=(协议=tcp)(主机=销售服务器)…)
  • 我最喜欢的方法是#3。当您遇到问题时,调试会容易得多


    您可以在文档的数据源部分找到更多信息。

    我认为在某个地方有过多的尝试,或者堆栈让我认为这是一个异步控制器调用,但您没有使用异步方法(“始终异步”)

    说明:


    这里还有别的事情。虽然我很高兴关于try/catch块的建议帮助您解决了这个问题,但是简化代码bock不需要这些建议-应该抛出ora异常来代替null引用异常。

    在我的版本中,Oracle Path变量设置错误(因为之前有另一个Oracle客户端安装)。所以我建议也要考虑到这种可能性

    按照我的电脑(这台电脑)->属性->高级系统设置->高级->环境变量->路径
    您可以编辑Oracle主路径。

    我遇到了同样的问题,并解决了添加到我的C#项目引用的问题 Oracle.ManagedDataAccess而不是Oracle.DataAccess
    要执行此操作,请转到(工具/Nugget Package Manager/Nugget Package Manager for Solution)浏览Oracle参考资料并选择Oracle.ManagedDataAccess
    然后,您需要注释或删除对ManagedDataAccess的实际DataAccess调用,如下所示:

    //using Oracle.DataAccess.Client; 
    //using Oracle.DataAccess.Types;
    using Oracle.ManagedDataAccess.Client;
    
    无需更改连接代码,只需使用编码即可。
    工作完成后,您可以从项目引用中删除Oracle.DataAccess

    您应该在较小的测试环境中进行测试。创建一个。请在open()调用周围添加一个try-catch块,并在OracleException中提供ORA错误。@ChristianShay很抱歉,我刚刚回复您。我添加了try-catch块,它返回ORA12154-TNS无法解析。经过一些研究,我在ODP for.NET Oracle主路径中向tnsnames.ora文件添加了一个SID,它成功了!如果您创建了一个答案(尽管问题可能会变成关于TNS的问题),我很乐意为您标记答案,请发布整个控制器方法。你应该得到一个错误。我认为您在异步模式中做错了什么。我添加了try-catch块,它返回ORA12154-TNS无法解析。经过一些研究,我在ODP for.NET Oracle主路径中的tnsnames.ora文件中添加了一个SID,并且worked@Dan你的术语是错误的。它是一个“连接标识符”。SID是连接标识符中的一个可能参数,您可以使用服务名称来代替。不正确的说法是“ODP.NET不读取TNSNAMES.ORA文件”。它使用“TNS_ADMIN”变量来查找它,这取决于在machine.config(OUI machine-wide-install)中的安装时如何设置ODP.NET,或者根本不设置(Nuget)。当未设置TNS_ADMIN时,您的应用程序还将读取应用程序工作目录中的tnsnames.ora文件。有关详细信息,请参阅文档。您是否阅读了完整答案?您错过了我这句话的最后一部分,“就像VisualStudio所做的那样”,它解释了为什么连接测试可以工作,但代码中没有。然后,对于所有3个选项,我都从我在答案中链接的文档中获得了它们!是的,ODP.NET使用了“TNS#u ADMIN”变量(这是我的观点1)@ChristianShay如果
    TNS\u ADMIN
    未设置,它不会也检查
    ORACLE\u HOME
    吗?我明白你的意思,但我仍然有答案。我把这部分放在第一位,其他两个答案传播了一个普遍的观点,即用try/catch来获取更多信息是一个解决方案,这是绝对不正确的。我可以对这两个问题都发表评论吗。但与此同时,其他人看到了这两个答案。我宁愿增加我停止这种传播的机会,并发布另一个答案。如果OP想发布更多的细节,我很乐意进一步探索。不确定选民的评论去了哪里,但如果他在删除评论时也删除了他的反对票,那就太好了;)。可能只是人们的挫折
    //using Oracle.DataAccess.Client; 
    //using Oracle.DataAccess.Types;
    using Oracle.ManagedDataAccess.Client;