/// <summary> /// <paramref name="cmd"/> 를 비동기 방식으로 실행하여, <see cref="Task{MySqlDataReader}"/>를 반환받습니다. /// 받환받은 DataReader는 꼭 Dispose() 해 주어야 Connection이 닫힙니다. /// </summary> /// <param name="db">DAAB의 MySQL 용 Database</param> /// <param name="cmd">실행할 <see cref="MySqlCommand"/> 인스턴스</param> /// <param name="parameters">Command Parameters</param> /// <returns><see cref="MySqlDataReader"/>를 결과로 반환하는 <see cref="Task"/></returns> public static Task <MySqlDataReader> ExecuteReaderAsync(this MySqlDatabase db, MySqlCommand cmd, params IAdoParameter[] parameters) { cmd.ShouldNotBeNull("cmd"); if (IsDebugEnabled) { log.Debug("MySqlCommand.ExecuteReader를 비동기 방식으로 실행합니다. CommandText=[{0}], Parameters=[{1}]", cmd.CommandText, parameters.CollectionToString()); } var newConnectionCreated = false; if (cmd.Connection == null) { cmd.Connection = db.CreateMySqlConnection(ref newConnectionCreated); } if (parameters != null) { AdoTool.SetParameterValues(db, cmd, parameters); } var commandBehavior = newConnectionCreated ? CommandBehavior.CloseConnection : CommandBehavior.Default; //! NOTE: FromAsync를 사용하지 못한 이유가 SqlCommand.BeginExecuteReader() 의 overloading이 많아서, 모호한 함수 호출 때문이다. // var ar = cmd.BeginExecuteReader(commandBehavior); return (Task <MySqlDataReader> .Factory .StartNew(state => cmd.EndExecuteReader((IAsyncResult)state), ar, TaskCreationOptions.PreferFairness)); }
/// <summary> /// <see cref="MySqlCommand"/>을 ExecuteNonQuery 메소드로 비동기 실행을 하도록 하는 <see cref="Task{Int32}"/>를 빌드합니다. /// </summary> /// <param name="db">DAAB의 MySQL 용 Database</param> /// <param name="cmd">실행할 SqlComnnad 인스턴스</param> /// <param name="parameters">파리미터 정보</param> /// <returns>실행에 영향을 받은 행의 수를 결과로 가지는 <see cref="Task{Int32}"/></returns> public static Task <int> ExecuteNonQueryAsync(this MySqlDatabase db, MySqlCommand cmd, params IAdoParameter[] parameters) { cmd.ShouldNotBeNull("cmd"); if (IsDebugEnabled) { log.Debug("MySqlCommand.ExecuteNonQuery를 비동기 방식으로 실행합니다. CommandText=[{0}], Parameters=[{1}]", cmd.CommandText, cmd.Parameters.CollectionToString()); } var newConnectionCreated = false; if (cmd.Connection == null) { cmd.Connection = db.CreateMySqlConnection(ref newConnectionCreated); } if (parameters != null) { AdoTool.SetParameterValues(db, cmd, parameters); } return (Task <int> .Factory .FromAsync(cmd.BeginExecuteNonQuery, cmd.EndExecuteNonQuery, null) .ContinueWith(task => { if (newConnectionCreated) { AdoTool.ForceCloseConnection(cmd); } return task; }, TaskContinuationOptions.ExecuteSynchronously) .Unwrap()); }
/// <summary> /// <paramref name="cmd"/> 를 비동기 방식으로 실행하여, Scalar 값을 반환하는 <see cref="Task{Object}"/>를 빌드합니다. /// </summary> /// <param name="db">DAAB의 MySQL 용 Database</param> /// <param name="cmd">실행할 MySqlCommand 인스턴스</param> /// <param name="parameters">Command Parameters</param> /// <returns>Scalar 값을 결과로 가지는 Task의 인스턴스</returns> public static Task <object> ExecuteScalarAsync(this MySqlDatabase db, MySqlCommand cmd, params IAdoParameter[] parameters) { cmd.ShouldNotBeNull("cmd"); if (IsDebugEnabled) { log.Debug("MySqlCommand.ExecuteScalar를 비동기 방식으로 실행합니다... CommandText=[{0}], Parameters=[{1}]", cmd.CommandText, parameters.CollectionToString()); } var newConnectionCreated = false; if (cmd.Connection == null) { cmd.Connection = db.CreateMySqlConnection(ref newConnectionCreated); } if (parameters != null) { AdoTool.SetParameterValues(db, cmd, parameters); } return (Task.Factory .StartNew(() => cmd.ExecuteScalar(), TaskCreationOptions.PreferFairness) .ContinueWith(task => { if (newConnectionCreated) { AdoTool.ForceCloseConnection(cmd); } return task; }, TaskContinuationOptions.ExecuteSynchronously) .Unwrap()); }