从 .NET 代码连接时出现 Oracle 连接打开错误

Sha*_*500 1 c# asp.net oracle

我收到此错误(我正在使用 Oracle.DataAccess dll):

{Oracle.DataAccess.Client.OracleConnection}

(Oracle.DataAccess.Client.OracleException).DataSource threw an exception of type 'System.NullReferenceException'
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪 :

at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32
errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx*
pOpoSqlValCtx, Object src, String procedure, Boolean bCheck, Int32
isRecoverable)
   at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode,
OracleConnection conn, IntPtr opsErrCtx, Object src)
   at Oracle.DataAccess.Client.OracleConnection.Open()
Run Code Online (Sandbox Code Playgroud)

代码:

 using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["myConnection"].ConnectionString))
            {
                using (OracleCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "<<Procedure Name>>";
                    cmd.Parameters.Add("v_cur", OracleDbType.RefCursor).Direction = ParameterDirection.Output;

                    conn.Open(); --line throws exception
                    using (OracleDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            retVal = reader["VALUE"].ToString();
                        }
                        reader.Close();
                    }
                }
            }
Run Code Online (Sandbox Code Playgroud)

任何输入都会有帮助吗?谢谢。

Ben*_*Ben 5

我从 Oracle 网站下载了ODAC121021Xcopy_32bit并解压缩 zip 并使用 install.bat 文件进行安装。

我确实遇到了同样的问题。谢谢奥马拉吉雷。正如 Omaraguirre 所说,引用了 Oracle.ManagedDataAccess.dll,问题得到了解决。我可以毫无问题地打开连接。

但我想弄清楚为什么 Oracle.DatAccess.dll 在尝试打开连接时抛出空引用异常。我发现需要支持 dll(如 oci.dll、ociwin32.dll 等)才能打开连接而不会出现错误。因此,我将所有 dll 文件从instantclient_12_1(此文件夹位于提取的 ODAC121021Xcopy_32bit 文件夹中)文件夹复制到 oracle 安装的 bin 目录(在我的计算机中为C:\oracle\bin)。现在,Oracle.DataAccess.dll 在打开连接时不会抛出错误。

另一件事是 Oracle.ManagedDataAccess.dll 将在内部加载所有支持的 dll 文件。但是 Oracle.DataAccess.dll 要求支持 dll 存在于执行应用程序目录(如果是控制台/WinForm 应用程序)或 Oracle 安装的 bin 目录(如果是 Web 应用程序)中。Oracle.DataAccess.dll 和 Oracle.ManagedDataAccess.dll 之间的区别可以在 @ https://docs.oracle.com/database/121/ODPNT/intro003.htm#ODPNT131找到