CreateTransactionScopeConnection() public static method

현재 Transaction에 해당하는 Connection을 반환한다. 이미 열려진 Connection을 재활용하거나, TransactionScope가 활성화되어 있다면 새로운 connection을 빌드해서 반환한다. TransactionScope도 없고, Database관련해서 아직 만들어진게 없다면, 새로운 DbConnection을 생성하고, Open() 해서 반환한다.
public static CreateTransactionScopeConnection ( Database db ) : DbConnection
db Database instance of
return DbConnection
Exemplo n.º 1
0
        /// <summary>
        /// ADO.NET의 기본 Transaction을 시작한다. (TransactionScope와는 달리 DTC를 이용하지 않는다.)
        /// </summary>
        /// <param name="isolationLevel">Transaction 격리수준 (기본적으로 ReadCommitted)</param>
        /// <returns>Return a new instance of DbTransaction</returns>
        /// <example>
        /// <code>
        /// AdoRepository.BeginTransaction(IsolationLevel.ReadUncommitted);
        /// try
        /// {
        ///     DbCommand insertCommand = AdoRepository.GetSqlStringCommand(InsertString);
        ///     DbCommand deleteCommand = AdoRepository.GetSqlStringCommand(DeleteString);
        ///     DbCommand countCommand = AdoRepository.GetSqlStringCommand(CountString);
        ///
        ///     var count = Convert.ToInt32(AdoRepository.ExecuteScalar(countCommand));
        ///
        ///     AdoRepository.ExecuteNonQuery(insertCommand);
        ///     AdoRepository.ExecuteNonQuery(deleteCommand);
        ///
        ///     AdoRepository.Commit();
        ///
        ///     Assert.AreEqual(4, count);
        /// }
        /// catch (Exception ex)
        /// {
        ///     if (IsErrorEnabled)
        ///         log.ErrorException(ex);
        ///
        ///     AdoRepository.Rollback();
        ///
        ///     throw;
        /// }
        /// </code>
        /// </example>
        public virtual DbTransaction BeginTransaction(System.Data.IsolationLevel isolationLevel)
        {
            var connection = AdoTool.CreateTransactionScopeConnection(Db);

            ActiveTransaction = connection.BeginTransaction(isolationLevel);

            if (IsDebugEnabled)
            {
                log.Debug("Database=[{0}]에 새로운 Transaction을 시작했습니다.  Transaction=[{1}]",
                          connection.Database, ActiveTransaction.GetType().FullName);
            }

            return(ActiveTransaction);
        }
        /// <summary>
        /// Command를 실행시켜, 결과 셋을 DataSet에 저장한다.<br/>
        /// 여러 ResultSet을 반환하는 경우 각각의 ResultSet에 대응하는 TableName을 제공해야 합니다.
        /// </summary>
        /// <param name="repository">IAdoRepository 인스턴스</param>
        /// <param name="cmd">실행할 Command</param>
        /// <param name="targetDataSet"></param>
        /// <param name="tableNames"></param>
        /// <example>
        /// <code>
        /// // Region 전체 정보 및 갯수를 가져옵니다.
        /// string query = "select * from Region; select count(*) from Region";
        ///
        /// DataSet ds = new DataSet();
        /// using (DbCommand cmd = Impl.GetSqlStringCommand(query))
        /// {
        ///     Impl.LoadDataSet(cmd, ds, new string[] { "Region", "CountOfRegion" });
        ///     Assert.AreEqual(2, ds.Tables.Count);
        ///     Assert.AreEqual(4, ds.Tables[1].Rows[0][0]);
        /// }
        /// </code>
        /// </example>
        public static void LoadDataSet(this IAdoRepository repository, DbCommand cmd, DataSet targetDataSet, string[] tableNames)
        {
            cmd.ShouldNotBeNull("cmd");
            tableNames.ShouldNotBeEmpty("tableNames");

            if (IsDebugEnabled)
            {
                log.Debug("DbCommand를 실행하여 DataSet에 로등합니다... cmd.CommandText=[{0}], tableNames=[{1}]",
                          cmd.CommandText, tableNames.CollectionToString());
            }

            for (int i = 0; i < tableNames.Length; i++)
            {
                tableNames[i].ShouldNotBeWhiteSpace("index=" + i);
            }

            if (repository.IsActiveTransaction)
            {
                AdoTool.EnlistCommandToActiveTransaction(repository, cmd);
            }

            var newConnectionCreated = false;

            if (cmd.Connection == null)
            {
                cmd.Connection = AdoTool.CreateTransactionScopeConnection(repository.Db, ref newConnectionCreated);
            }

            using (var adapter = repository.GetDataAdapter()) {
                for (var j = 0; j < tableNames.Length; j++)
                {
                    var sourceTable = (j == 0) ? AdoTool.DefaultTableName : (AdoTool.DefaultTableName + j);
                    adapter.TableMappings.Add(sourceTable, tableNames[j]);
                }

                adapter.SelectCommand = cmd;
                adapter.Fill(targetDataSet);

                if (newConnectionCreated)
                {
                    AdoTool.ForceCloseConnection(adapter.SelectCommand);
                }
            }
        }