Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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 ODP.NET和Visual Studio:连接问题_C#_Oracle_Visual Studio_Odp.net - Fatal编程技术网

C# Oracle ODP.NET和Visual Studio:连接问题

C# Oracle ODP.NET和Visual Studio:连接问题,c#,oracle,visual-studio,odp.net,C#,Oracle,Visual Studio,Odp.net,长期潜伏者和第一次寻求帮助:) 我们有一个一直困扰着我们的错误。我们无法使用Visual Studio从某些Web服务连接到Oracle数据库。我们目前正在使用非托管的x64 Oracle.DataAccess.dll库(在托管驱动程序出现一些奇怪的问题之后) 这是一个冗长而复杂的web服务,但失败的关键在于以下代码: protected virtual void PrepareCommand(IDbCommand command, IDbConnection connection, IDbTr

长期潜伏者和第一次寻求帮助:)

我们有一个一直困扰着我们的错误。我们无法使用Visual Studio从某些Web服务连接到Oracle数据库。我们目前正在使用非托管的x64 Oracle.DataAccess.dll库(在托管驱动程序出现一些奇怪的问题之后)

这是一个冗长而复杂的web服务,但失败的关键在于以下代码:

protected virtual void PrepareCommand(IDbCommand command, IDbConnection connection, IDbTransaction transaction, CommandType commandType, string commandText, IDataParameter[] commandParameters, out bool mustCloseConnection)
        {
            if (command == null) throw new ArgumentNullException("command");
            if (string.IsNullOrEmpty(commandText)) throw new ArgumentNullException("commandText");

            // If the provided connection is not open, we will open it
            if (connection.State != ConnectionState.Open)
            {
                mustCloseConnection = true;
                connection.Open(); // <-- here
            }
从外部(Oracle SQL Developer access)可以完美地实现此连接

调用此方法后,将生成一个异常,该异常具有以下属性:

Message = "Reference to an object not set as an instance of an object" <- Roughly translated by me, foreign IDE :(

StackTrace = "   en Oracle.DataAccess.Client.OracleException.get_Number()\r\n   en Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bChec...
ConnectionString:“数据源=(描述=(地址列表=(地址=(协议=TCP)(主机=asdf)(端口=1521))(连接数据=(服务器=专用)(服务名称=asdf));登记=真;用户Id=asdf;密码=asdf;”

EDIT2:正如建议的那样,我试图打开一个普通的OracleConnection,然后。。。它失败了。测试:

// Simple test para ver si funciona crear una conexión normal de Oracle
        try
        {
            string oradb = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=asdf)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=asdf)));Enlist=true;User Id=asdf;Password=asdf;";
            OracleConnection conn = new OracleConnection(oradb);

            conn.Open(); // <-- fails here

            OracleCommand cmd = new OracleCommand();

            ......

            conn.Dispose();
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
        ////////////////////////////////////////

显然,连接对象不是很好,否则不会出现错误。Visual Studio是32位的,因此如果(仅)安装了x64 Oracle.DataAccess.dll,则无法调试程序。您是否将程序编译为x64(或任何CPU)?看起来它们确实可以调试:是的,它编译为x64(以前是任何CPU,但无论如何都试图将其强制为64位):)您是对的,我错过了。在VS2012中,您有一个限制,即在x64模式下调试时无法编辑代码,我将其混合在一起。如何创建连接对象?注意,SQL Developer基于Java,它完全独立于通过ODP.NET(Oracle.DataAccess.dll)的访问,并在原始问题中添加了信息:)
    using Oracle.DataAccess.Client;
    ...
    using (OracleConnection oraConn = new OracleConnection(AdoFactory.Instance.Helper.GetConnection().ConnectionString))
                {
                    var newUser = **SessionDTO.GetSession**(token, oraConn);

                    AdoFactory.Instance.Usuario = newUser;

                    return newUser;
                }
    ...
    public static Usuario GetSession(string token, OracleConnection oraConn)
            {
                Usuario userActive = null;

                #region Parameters
                var m_paramToken = AdoFactory.Instance.Helper.GetParameter("p_TOKEN", token);
                #endregion

                var m_parameters = new[] { m_paramToken, AdoFactory.Instance.Helper.GetCursorForProcedure() };
                using (IDataReader reader = AdoFactory.Instance.Helper.**ExecuteReader**(oraConn,
                                                                        CommandType.StoredProcedure,"nameofprocedurewhichworksnicelyfromSQL",
                                                                        m_parameters))
                {
                    while (reader.Read())
                    {
    ...
public IDataReader ExecuteReader(IDbConnection p_connection, CommandType p_commandType, string p_commandText, params IDataParameter[] p_commandParameters)
        {
            // Pass through the call to the private overload using a null transaction value and an externally owned connection
            return ExecuteReader(p_connection, null, p_commandType, p_commandText, p_commandParameters, AdoConnectionOwnership.External);
        }
...
private IDataReader ExecuteReader(IDbConnection p_connection, IDbTransaction p_transaction, CommandType p_commandType, string p_commandText, IDataParameter[] p_commandParameters, AdoConnectionOwnership p_connectionOwnership)
        {
            if (p_connection == null) throw new ArgumentNullException("p_connection");

            var mustCloseConnection = false;
            // Create a command and prepare it for execution
            var cmd = p_connection.CreateCommand();
            try
            {
                **PrepareCommand**(cmd, p_connection, p_transaction, p_commandType, p_commandText, p_commandParameters, out mustCloseConnection);

                // Create a reader

                // Call ExecuteReader with the appropriate CommandBehavior
                var dataReader = p_connectionOwnership == AdoConnectionOwnership.External ? cmd.ExecuteReader() : cmd.ExecuteReader(CommandBehavior.CloseConnection);

                ClearCommand(cmd);
                return dataReader;
            }
            catch { 
                if (mustCloseConnection) p_connection.Close();
                throw;
            }
        }
// Simple test para ver si funciona crear una conexión normal de Oracle
        try
        {
            string oradb = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=asdf)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=asdf)));Enlist=true;User Id=asdf;Password=asdf;";
            OracleConnection conn = new OracleConnection(oradb);

            conn.Open(); // <-- fails here

            OracleCommand cmd = new OracleCommand();

            ......

            conn.Dispose();
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
        ////////////////////////////////////////
    conn    {Oracle.DataAccess.Client.OracleConnection} Oracle.DataAccess.Client.OracleConnection
        CanRaiseEvents  true    bool
        CanRaiseEventsInternal  true    bool
        ConnectionCloseEvent    null    Oracle.DataAccess.Client.OracleConnection.OracleConnectionCloseEventHandler
        ConnectionString    "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=--EDITED--)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=--EDITED--)));Enlist=true;User Id=--EDITED--;Password=--EDITED--;"   string
        ConnectionTimeout   15  int
        ConnectionType  Undefined   Oracle.DataAccess.Client.OracleConnectionType
        Container   null    System.ComponentModel.IContainer
        DRCPConnectionClass null    string
        DRCPPurity  Pooled  Oracle.DataAccess.Client.OracleConnection.OracleDRCPPurity
        DataSource  "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=--EDITED--)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=--EDITED--)))"   string
        Database    ""  string
        DatabaseDomainName  ""  string
        DatabaseEditionName null    string
        DatabaseName    ""  string
+       DbProviderFactory   {Oracle.DataAccess.Client.OracleClientFactory}  System.Data.Common.DbProviderFactory {Oracle.DataAccess.Client.OracleClientFactory}
        DesignMode  false   bool
+       Events  {System.ComponentModel.EventHandlerList}    System.ComponentModel.EventHandlerList
        ForceNewConnection  false   bool
        HostName    ""  string
        Identity    null    object
        InstanceName    ""  string
        IsDBVer10gR2OrHigher    false   bool
        IsDBVer11gR1OrHigher    false   bool
        IsDBVer11gR2OrHigher    false   bool
        IsDBVer12cR1OrHigher    false   bool
        IsDBVer_11_1_0_7_OrHigher   false   bool
        LogicalTransactionId    null    byte[]
+       OracleLogicalTransaction    {Oracle.DataAccess.Client.OracleLogicalTransaction} Oracle.DataAccess.Client.OracleLogicalTransaction
        PDBName ""  string
+       ProviderFactory {Oracle.DataAccess.Client.OracleClientFactory}  System.Data.Common.DbProviderFactory {Oracle.DataAccess.Client.OracleClientFactory}
+       ServerVersion   'conn.ServerVersion' threw an exception of type 'System.InvalidOperationException'  string {System.InvalidOperationException}
        ServiceName ""  string
        Site    null    System.ComponentModel.ISite
        State   Closed  System.Data.ConnectionState
        StatementCacheSize  0   int
        SwitchedConnection  false   bool
+       TxnHndAllocated 'conn.TxnHndAllocated' threw an exception of type 'System.NullReferenceException'   int {System.NullReferenceException}
        __identity  null    object
        _stateChangeEventHandler    null    System.Data.StateChangeEventHandler
        _supressStateChangeForReconnection  false   bool
+       events  {System.ComponentModel.EventHandlerList}    System.ComponentModel.EventHandlerList
+       listofWeakReferenceObj  Count = 0   System.Collections.Generic.List<System.WeakReference>
        lockOnWeakReferenceObjList  {object}    object
+       m_DataReaderList    Count = 0   System.Collections.ArrayList
        m_PatchSetVersion   0   int
        m_appEdition    null    string
        m_bCloseInProgress  false   bool
        m_bConnforTxnStatus false   bool
        m_bDrcpPurityNew    0   byte
        m_bErrorDoingErrorTranslation   false   bool
        m_bGetOutcome   false   bool
        m_bLocalTxnStartedForSysTxn false   bool
        m_bPrelimAuthSession    false   bool
        m_bSTFEnabled   false   bool
        m_bStartupShutdown  false   bool
        m_conOpenEventHandler   null    Oracle.DataAccess.Client.OracleConnectionOpenEventHandler
        m_conSignature  0   int
+       m_conStrVals    {object[33]}    object[]
        m_conStrValsFromPool    false   bool
        m_conString "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=--EDITED--)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=--EDITED--)));Enlist=true;User Id=--EDITED--;Password=--EDITED--;"   string
        m_conTimeout    15  int
        m_contextConnection false   bool
        m_criteriaCtx   null    OracleInternal.ConnectionPool.CriteriaCtx
+       m_cs    {datasrc=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=--EDITED--)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=--EDITED--)));enlist=True;lifetime=0;maxsize=100;minsize=1;incsize=5;decsize=5;timeout=15;dbapriv=None;validcon=False;pooling=True;stmtcache=0;stmtcachepurge=0;metapool=True;selftuning=True;pspe=Promotable;ha=1;rlb=1;ac=1;userid=--EDITED--} OracleInternal.ConnectionPool.ConnectionString
        m_dataSource    "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=--EDITED--)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=--EDITED--)))"   string
        m_databaseDomainName    ""  string
        m_databaseName  ""  string
        m_disposed  false   bool
        m_drcpConnectionClass   null    string
        m_drcpPurity    Pooled  Oracle.DataAccess.Client.OracleConnection.OracleDRCPPurity
        m_enlist    0   int
        m_extProcEnv    null    Oracle.DataAccess.Client.OracleConnection.ExtProcEnv
        m_failoverEventHandler  null    Oracle.DataAccess.Client.OracleFailoverEventHandler
        m_hostName  ""  string
        m_id    null    string
        m_implId    0   int
+       m_implicitRefCursorCtxList  Count = 0   System.Collections.ArrayList
        m_infoMessageEventHandler   null    Oracle.DataAccess.Client.OracleInfoMessageEventHandler
        m_instanceName  ""  string
        m_internalConStr    "datasrc=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=--EDITED--)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=--EDITED--)));enlist=1;lifetime=0;maxsize=100;minsize=1;incsize=5;decsize=1;timeout=15;dbapriv=;validcon=0;stmtcache=0;stmtcachepurge=0;pooling=1;metapool=1;selftuning=1;pspe=promotable;ha=1;rlb=1;ac=1;userid=--EDITED--" string
        m_internalUse   false   bool
        m_isDb10gR2OrHigher false   bool
        m_isPuritySet   false   bool
+       m_lastEnlistedTransaction   null    System.Transactions.Transaction
        m_logicalTransaction    null    Oracle.DataAccess.Client.OracleLogicalTransaction
        m_majorVersion  0   int
+       m_metaDataCollectionDS  null    System.Data.DataSet
        m_minorVersion  0   int
        m_newPassword   null    string
        m_openWithNewPwd    false   bool
+       m_opoConCtx {Oracle.DataAccess.Client.OpoConCtx}    OracleInternal.ConnectionPool.OracleConnectionImpl {Oracle.DataAccess.Client.OpoConCtx}
+       m_oraGlobClone  null    Oracle.DataAccess.Client.OracleGlobalization
        m_oraTransaction    null    Oracle.DataAccess.Client.OracleTransaction
+       m_oracleConnectionImpl  null    OracleInternal.ConnectionPool.OracleConnectionImpl
        m_orclPermission    null    Oracle.DataAccess.Client.OraclePermission
        m_password  "--EDITED--"    string
        m_pdbName   null    string
        m_persist   false   bool
        m_promoteTxnMgr null    OracleInternal.MTS.PSPETxnManagerBase
        m_proxyPassword ""  string
        m_pwdLessString "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=--EDITED--)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=--EDITED--)));Enlist=true;User Id=--EDITED--;"   string
        m_pwdOSLessString   "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=--EDITED--)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=--EDITED--)));Enlist=true;User Id=--EDITED--;"   string
        m_pwdValidated  false   bool
+       m_securePassword    null    System.Security.SecureString
+       m_secureProxyPassword   null    System.Security.SecureString
        m_serverVersion ""  string
        m_serviceName   ""  string
        m_sessionId 0   long
        m_state Closed  System.Data.ConnectionState
        m_stateChangeEventHandler   null    System.Data.StateChangeEventHandler
        m_stmtCacheSize 0   int
        m_syncTxnComplete   {object}    object
        m_tmpConString  null    string
        m_tuningLock    {object}    object
        m_userProvidedConEditionName    ""  string
        m_userProvidedPdbName   ""  string
        m_userProvidedServiceName   ""  string
        m_validConString    true    bool
+       pmCS    null    OracleInternal.ConnectionPool.ConnectionString
        site    null    System.ComponentModel.ISite
+       Static members  
    -       ex  {"Referencia a objeto no establecida como instancia de un objeto."} System.Exception {System.NullReferenceException}
+       Data    {System.Collections.ListDictionaryInternal} System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
        HResult -2147467261 int
        HelpLink    null    string
+       IPForWatsonBuckets  0x00007ffd87f6667a  System.UIntPtr
+       InnerException  null    System.Exception
        IsTransient false   bool
        Message "Referencia a objeto no establecida como instancia de un objeto."   string
        RemoteStackTrace    null    string
        Source  "Oracle.DataAccess" string
        StackTrace  "   en Oracle.DataAccess.Client.OracleException.get_Number()\r\n   en Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck, Int32 isRecoverable, OracleLogicalTransaction m_OracleLogicalTransaction)\r\n   en Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src, OracleLogicalTransaction m_oracleLogicalTransaction)\r\n   en Oracle.DataAccess.Client.OracleConnectionOCP.Open(OracleConnection con)\r\n   en Oracle.DataAccess.Client.OracleConnection.Open()\r\n   en UNED.FP.BL.OAuth.OAuth.ValidateToken(String token) en --EDITED--"  string
+       TargetSite  {Int32 get_Number()}    System.Reflection.MethodBase {System.Reflection.RuntimeMethodInfo}
        WatsonBuckets   null    object
        _HResult    -2147467261 int
        _className  null    string
+       _data   {System.Collections.ListDictionaryInternal} System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
        _dynamicMethods null    object
+       _exceptionMethod    {Int32 get_Number()}    System.Reflection.MethodBase {System.Reflection.RuntimeMethodInfo}
        _exceptionMethodString  null    string
        _helpURL    null    string
+       _innerException null    System.Exception
+       _ipForWatsonBuckets 0x00007ffd87f6667a  System.UIntPtr
        _message    "Referencia a objeto no establecida como instancia de un objeto."   string
        _remoteStackIndex   0   int
        _remoteStackTraceString null    string
+       _safeSerializationManager   {System.Runtime.Serialization.SafeSerializationManager} System.Runtime.Serialization.SafeSerializationManager
        _source "Oracle.DataAccess" string
+       _stackTrace {sbyte[384]}    object {sbyte[]}
        _stackTraceString   null    string
        _watsonBuckets  null    object
        _xcode  -532462766  int
+       _xptrs  0x0000000000000000  System.IntPtr
+       Static members