Exemplo n.º 1
0
        /// <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));
        }
Exemplo n.º 2
0
        /// <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));
        }
Exemplo n.º 3
0
        //! ======================================================================================

        /// <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)));
        }
Exemplo n.º 4
0
 /// <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));
 }