using System; using System.Data; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using JetBrains.Annotations; using SDA.DataProvider.Core; namespace SDA.DataProvider { /// /// Adatbázis-kapcsolat /// public class SDAConnection : IDisposable /*, IDbConnection */ { [NotNull] internal SDAConnectionWrapper Connection; /// /// Előállít egy új adatbázis-kapcsolat példányt. /// public SDAConnection() { if (SDAFactory.Instance == null) { throw new InvalidOperationException("SDAFactory.Instance"); } Connection = SDAFactory.Instance.CreateConnection(); } /// /// Előállít egy új adatbázis-kapcsolat példányt. /// /// Az adatbázis-kapcsolat paramétereit leíró karakterlánc public SDAConnection([CanBeNull] string connectionString) { if (SDAFactory.Instance == null) { throw new InvalidOperationException("SDAFactory.Instance"); } Connection = SDAFactory.Instance.CreateConnection(); Connection.ConnectionString = connectionString; } /// /// Előállít egy új adatbázis-kapcsolat példányt. /// /// Az adatbázis típusa. /// Az adatbázis-kapcsolat paramétereit leíró karakterlánc. public SDAConnection(DatabaseType databaseType, [CanBeNull] string connectionString) : this(databaseType, connectionString, null) { } /// /// Előállít egy új adatbázis-kapcsolat példányt. /// /// Az adatbázis típusa. /// Az adatbázis-kapcsolat paramétereit leíró karakterlánc. /// Command timeout-ja. public SDAConnection(DatabaseType databaseType, [CanBeNull] string connectionString, int? commandTimeout) { var factory = SDAFactory.GetByDatabaseType(databaseType, commandTimeout); Debug.Assert(factory != null, "factory != null"); Connection = factory.CreateConnection(); Debug.Assert(Connection != null, "Connection != null"); Connection.ConnectionString = connectionString; } /// /// Megnyitja az adatbázis-kapcsolatot. /// public void Open() { OpenWithRetry(0); } /// /// Lezárja az adatbáziskapcsolatot. /// public void Close() { Connection.Close(); } /// /// Létrehoz egy - az adatbázis-kapcsolathoz tartozó - adatbázis-parancs objektumot /// /// Egy adatbázis-parancs objektum [NotNull] public SDACommand CreateCommand() { return new SDACommand(Connection.CreateCommand()); } /// /// Létrehoz egy - az adatbázis-kapcsolathoz tartozó - adatbázis-parancs objektumot /// /// A parancs objektum szövege /// Egy adatbázis-parancs objektum [NotNull] [SuppressMessage("ReSharper", "UseObjectOrCollectionInitializer")] public SDACommand CreateCommand([CanBeNull] string commandText) { SDACommandWrapper command = null; SDACommand result = null; try { command = Connection.CreateCommand(); result = new SDACommand(command); result.CommandText = commandText; return result; } catch { command?.Dispose(); result?.Dispose(); throw; } } /// /// Adatbázis ügyletet kezdeményez. /// /// Egy adatbázis-ügylet objektum [NotNull] public SDATransaction BeginTransaction() { return new SDATransaction(Connection.BeginTransaction()); } /// /// Adatbázis ügyletet kezdeményez. /// /// Elválasztás szintje /// Egy adatbázis-ügylet objektum [NotNull] public SDATransaction BeginTransaction(IsolationLevel isolationLevel) { return new SDATransaction(Connection.BeginTransaction(isolationLevel)); } /// /// Létrehoz egy -t nagyon gyors /// adatbeszúrásokhoz. /// /// /// Opcionális objektum, ha nincs megadva, /// akkor a bulk művelet _nem_ fut tranzakcióban, azaz ha megáll egy /// hiba miatt, akkor a már beszúrt sorok nem görgetődnek vissza! /// Viszont ha a kapcsolaton már van aktív tranzakció, akkor azt /// kötelező megadni a bulk insertnek is. /// /// /// Egy új . /// [NotNull] public SDABulkAdapter CreateBulkAdapter(SDATransaction transaction = null) { return Connection.CreateBulkAdapter(transaction); } /// /// Üresre törli az adatbázis-szerver connection pool-ját. /// /// /// True érték esetén az összes pool-t alaphelyzetbe hozza, /// False érték esetén csak az adott kapcsolathoz tartozót. /// public void ResetConnectionPool(bool all = false) { Connection.ResetConnectionPool(all); } /// /// Az adatbázis-kapcsolat paramétereit leíró karakterlánc. /// [CanBeNull] public string ConnectionString { get { return Connection.ConnectionString; } set { Connection.ConnectionString = value; } } /// /// Az adatbázis-kapcsolat állapota. /// public ConnectionState State => Connection.State; bool _disposed; /// /// Explicit destruktor. /// /// Programozott felszabadítás? protected virtual void Dispose(bool disposing) { if (_disposed) { return; } if (disposing) { Connection.Dispose(); SDAConnectionDiagnostics.DecrementActiveConnections(); } _disposed = true; } /// /// Eldobja az objektumot. /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } //#region IDbConnection Members //public void ChangeDatabase(string databaseName) //{ //} //IDbTransaction IDbConnection.BeginTransaction(System.Data.IsolationLevel il) //{ // return BeginTransaction(il); //} //IDbTransaction IDbConnection.BeginTransaction() //{ // return BeginTransaction(); //} //IDbCommand IDbConnection.CreateCommand() //{ // throw new NotImplementedException(); // return CreateCommand(); //} //public string Database //{ // get { return m_Connection.Database; } //} //public int ConnectionTimeout //{ // get { return m_Connection.ConnectionTimeout; } //} //#endregion #region Újrapróbálkozás void OpenWithRetry(int tries) { try { Connection.Open(); SDAConnectionDiagnostics.IncrementActiveConnections(); } catch (SDADataProviderException exception) { if ((exception.MustRetry) && (tries < Configuration.MaxTries)) { OpenWithRetry(tries + 1); } else { throw; } } } #endregion } }