internal void Disconnect()
{
if (null != _sessionPool)
{
// MARSOn may be true, but _sessionPool not yet created
_sessionPool.Dispose();
}
// Can close the connection if its open or broken
if (_state != TdsParserState.Closed)
{
//benign assert - the user could close the connection before consuming all the data
//Debug.Assert(_physicalStateObj._inBytesUsed == _physicalStateObj._inBytesRead && _physicalStateObj._outBytesUsed == _physicalStateObj._inputHeaderLen, "TDSParser closed with data not fully sent or consumed.");
_state = TdsParserState.Closed;
try
{
// If the _physicalStateObj has an owner, we will delay the disposal until the owner is finished with it
if (!_physicalStateObj.HasOwner)
{
_physicalStateObj.SniContext = SniContext.Snix_Close;
#if DEBUG
_physicalStateObj.InvalidateDebugOnlyCopyOfSniContext();
#endif
_physicalStateObj.Dispose();
}
else
{
// Remove the "initial" callback (this will allow the stateObj to be GC collected if need be)
_physicalStateObj.DecrementPendingCallbacks(false);
}
// Not allocated until MARS is actually enabled in SNI.
if (null != _pMarsPhysicalConObj)
{
_pMarsPhysicalConObj.Dispose();
}
}
finally
{
_pMarsPhysicalConObj = null;
}
}
}
private void OpenAndLogin() { // Open the connection and Login try { int timeout = _connectionOptions.ConnectTimeout; _parser = new TdsParser(); timeout = _parser.Connect(_connectionOptions.DataSource, _connectionOptions.NetworkLibrary, this, timeout, _connectionOptions.Encrypt); this.Login(timeout); _fConnectionOpen = true; // mark connection as open } catch (Exception e) { ADP.TraceException(e); // If the parser was allocated and we failed, then we must have failed on // either the Connect or Login, either way we should call Disconnect. // Disconnect can be called if the connection is already closed - becomes // no-op, so no issues there. if (_parser != null) { _parser.Disconnect(); } throw e; } }