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