/// <summary> /// 지정된 쿼리 문을 실행한 결과 셋의 레코드 갯수를 구한다. (SQL 문장이 SQL Count() 함수 문장으로 변환이 가능하다면 속도가 가장 빠르다.) /// </summary> /// <param name="repository">IAdoRepository 인스턴스</param> /// <param name="sqlString">실행할 Command 객체</param> /// <param name="parameters">Command 인자 정보</param> /// <returns>결과 셋의 레코드 수</returns> /// <remarks> /// 실제 SQL의 count(*) 함수로 변환할 수 있는 SQL문장이라면, 변환하여 Count 값을 가져오고, /// 불가능하다면 IDataReader를 이용하여 결과 셋을 가져와서 갯수만 센다. /// </remarks> /// <seealso cref="AdoTool.GetCountingSqlString"/> public static int CountBySqlString(this IAdoRepository repository, string sqlString, params IAdoParameter[] parameters) { sqlString.ShouldNotBeWhiteSpace("sqlString"); // 1. SELECT Count(*) FROM 구문으로 변환이 가능하다면, 변환된 SQL 문장을 수행한다. try { var countSql = AdoTool.GetCountingSqlString(sqlString); var count = repository.ExecuteScalarBySqlString(countSql, parameters).AsInt(-1); if (count > -1) { return(count); } } catch (Exception ex) { if (log.IsInfoEnabled) { log.Info("Count() SQL로 변환 작업이 지원되지 않는 문장입니다. DataReader를 이용하여, 결과 셋의 레코드 수를 알아봅니다."); log.Info("sqlString=[{0}]", sqlString); log.Info(ex); } } // 2. SQL Count() 함수를 이용하지 못할 경우라면, 그냥 DataReader를 이용하여 Count를 계산한다. // using (var cmd = repository.GetSqlStringCommand(sqlString)) return(repository.Count(cmd, parameters)); }
/// <summary> /// 지정된 쿼리 문을 실행한 결과 셋의 레코드 갯수를 구한다. /// </summary> /// <param name="repository">IAdoRepository 인스턴스</param> /// <param name="query">실행할 Command 객체</param> /// <param name="parameters">Command 인자 정보</param> /// <returns>결과 셋의 레코드 수</returns> /// <remarks> /// 실제 SQL의 count(*) 함수를 생성하는 것이 아니라, IDataReader를 이용하여 결과 셋을 가져와서 갯수만 센다. /// 장점은 DataSet을 이용하여 Paging하는 것보다 빠르고, Count 용 Query문을 따로 만들 필요가 없다. /// 단점은 SQL의 count(*) 함수보다는 당연히 느리다. /// </remarks> public static int Count(this IAdoRepository repository, string query, params IAdoParameter[] parameters) { query.ShouldNotBeWhiteSpace("query"); if (AdoTool.IsSqlString(query)) { return(repository.CountBySqlString(query, parameters)); } using (var cmd = repository.GetCommand(query)) return(repository.Count(cmd, parameters)); }
//! ====================================================================================== /// <summary> /// <see cref="Count(NSoft.NFramework.Data.IAdoRepository,string,NSoft.NFramework.Data.IAdoParameter[])"/>를 비동기 방식으로 수행합니다. /// </summary> /// <param name="repository"><see cref="IAdoRepository"/>의 인스턴스</param> /// <param name="query">실행할 쿼리문 또는 Procedure Name</param> /// <param name="parameters">패러미터</param> /// <returns>Count 수를 결과로 가지는 Task</returns> public static Task <int> CountAsync(this IAdoRepository repository, string query, params IAdoParameter[] parameters) { query.ShouldNotBeWhiteSpace("query"); if (IsDebugEnabled) { log.Debug("비동기 방식으로 IAdoRepository.Count()을 수행합니다... query=[{0}], parameters=[{1}]", query, parameters.CollectionToString()); } return(Task.Factory.StartNew(() => repository.Count(query, parameters))); }
/// <summary> /// 지정된 쿼리 문을 실행한 결과 셋의 레코드 갯수를 구한다. /// </summary> /// <param name="repository">IAdoRepository 인스턴스</param> /// <param name="spName">실행할 Command 객체</param> /// <param name="parameters">Command 인자 정보</param> /// <returns>결과 셋의 레코드 수</returns> /// <remarks> /// 실제 SQL의 count(*) 함수를 생성하는 것이 아니라, IDataReader를 이용하여 결과 셋을 가져와서 갯수만 센다. /// 장점은 DataSet을 이용하여 Paging하는 것보다 빠르고, Count 용 Query문을 따로 만들 필요가 없다. /// 단점은 SQL의 count(*) 함수보다는 당연히 느리다. /// </remarks> public static int CountByProcedure(this IAdoRepository repository, string spName, params IAdoParameter[] parameters) { using (var cmd = repository.GetProcedureCommand(spName, true)) return(repository.Count(cmd, parameters)); }