예제 #1
0
        /// <summary>
        /// <paramref name="oraCommand"/> 를 이용하여, <see cref="Task{OracleDataReader}"/>를 반환받습니다.
        /// 받환받은 DataReader는 꼭 Dispose() 해 주어야 Connection이 닫힙니다.
        /// </summary>
        /// <param name="oraDatabase">Devart dotConnector for Oracle을 이용하여 생성한 OracleProvider</param>
        /// <param name="oraCommand">실행할 OracleCommand 인스턴스</param>
        /// <param name="parameters">Command Parameters</param>
        /// <returns>OracleDataReader를 결과로 반환하는 Task</returns>
        public static Task <OracleDataReader> ExecuteReaderAsync(this EnterpriseLibrary.OracleDatabase oraDatabase,
                                                                 OracleCommand oraCommand, params IAdoParameter[] parameters)
        {
            oraCommand.ShouldNotBeNull("oraCommand");

            if (IsDebugEnabled)
            {
                log.Debug("OracleCommand.ExecuteReader를 비동기 방식으로 실행합니다. CommandText=[{0}], Parameters=[{1}]",
                          oraCommand.CommandText, parameters.CollectionToString());
            }

            var newConnectionCreated = false;

            if (oraCommand.Connection == null)
            {
                oraCommand.Connection = oraDatabase.CreateOracleConnection(ref newConnectionCreated);
            }

            if (parameters != null)
            {
                AdoTool.SetParameterValues(oraDatabase, oraCommand, parameters);
            }

            var commandBehavior = newConnectionCreated ? CommandBehavior.CloseConnection : CommandBehavior.Default;

            // NOTE: FromAsync를 사용하지 못한 이유가 OracleCommand.BeginExecuteReader() 의 overloading이 많아서, 모호한 함수 호출 때문이다.
            //
            var ar = oraCommand.BeginExecuteReader(commandBehavior);

            return
                (Task <OracleDataReader> .Factory.StartNew(state => oraCommand.EndExecuteReader((IAsyncResult)state),
                                                           ar,
                                                           TaskCreationOptions.PreferFairness));
        }
예제 #2
0
        /// <summary>
        /// <see cref="OracleCommand"/>을 ExecuteNonQuery 메소드로 비동기 실행을 하도록 하는 <see cref="Task{Int32}"/>를 빌드합니다.
        /// </summary>
        /// <param name="oraDatabase">Devart dotConnector for Oracle을 이용하여 생성한 OracleProvider</param>
        /// <param name="oraCommand">실행할 <see cref="OracleCommand"/> 인스턴스</param>
        /// <param name="parameters">파리미터 정보</param>
        /// <returns>실행에 영향을 받은 행의 수를 결과로 가지는 <see cref="Task{Int32}"/></returns>
        public static Task <int> ExecuteNonQueryAsync(this EnterpriseLibrary.OracleDatabase oraDatabase, OracleCommand oraCommand,
                                                      params IAdoParameter[] parameters)
        {
            oraCommand.ShouldNotBeNull("oraCommand");

            if (IsDebugEnabled)
            {
                log.Debug("OracleCommand.ExecuteNonQuery를 비동기 방식으로 실행합니다. CommandText=[{0}], Parameters=[{1}]",
                          oraCommand.CommandText, oraCommand.Parameters.CollectionToString());
            }


            // NOTE: FromAsync 메소드에서는 TaskCreationOptions.None 만 가능하다.
            //
            var newConnectionCreated = false;

            if (oraCommand.Connection == null)
            {
                oraCommand.Connection = oraDatabase.CreateOracleConnection(ref newConnectionCreated);
            }

            if (parameters != null)
            {
                AdoTool.SetParameterValues(oraDatabase, oraCommand, parameters);
            }

            return
                (Task <int> .Factory
                 .FromAsync(oraCommand.BeginExecuteNonQuery,
                            oraCommand.EndExecuteNonQuery,
                            null)
                 .ContinueWith(task => {
                if (newConnectionCreated)
                {
                    AdoTool.ForceCloseConnection(oraCommand);
                }
                return task;
            },
                               TaskContinuationOptions.ExecuteSynchronously)
                 .Unwrap());
        }
예제 #3
0
        /// <summary>
        /// <paramref name="oraCommand"/> 를 비동기 방식으로 실행하여, Scalar 값을 반환하는 <see cref="Task{Object}"/>를 빌드합니다.
        /// </summary>
        /// <param name="oraDatabase">Devart dotConnector for Oracle을 이용하여 생성한 OracleProvider</param>
        /// <param name="oraCommand">실행할 OracleCommand 인스턴스</param>
        /// <param name="parameters">Command Parameters</param>
        /// <returns>결과 Scalar 값을 가지는 Task의 인스턴스</returns>
        public static Task <object> ExecuteScalarAsync(this EnterpriseLibrary.OracleDatabase oraDatabase, OracleCommand oraCommand,
                                                       params IAdoParameter[] parameters)
        {
            oraCommand.ShouldNotBeNull("oraCommand");

            if (IsDebugEnabled)
            {
                log.Debug("OracleCommand.ExecuteScalar 를 비동기 방식으로 실행합니다. CommandText=[{0}], Parameters=[{1}]",
                          oraCommand.CommandText, oraCommand.Parameters.CollectionToString());
            }

            var newConnectionCreated = false;

            if (oraCommand.Connection == null)
            {
                oraCommand.Connection = oraDatabase.CreateOracleConnection(ref newConnectionCreated);
            }

            if (parameters != null)
            {
                AdoTool.SetParameterValues(oraDatabase, oraCommand, parameters);
            }

            return
                (Task.Factory
                 .StartNew(cmd => ((OracleCommand)cmd).ExecuteScalar(), oraCommand, TaskCreationOptions.PreferFairness)
                 .ContinueWith(task => {
                if (newConnectionCreated)
                {
                    AdoTool.ForceCloseConnection(oraCommand);
                }
                return task;
            },
                               TaskContinuationOptions.ExecuteSynchronously)
                 .Unwrap());
        }