Exemplo n.º 1
0
        /// <summary>
        /// Stored Procedure를 수행하고, OUTPUT, RETURN_VALUE를 반환한다.
        /// </summary>
        /// <param name="request">요청 항목</param>
        /// <param name="responseDocument">응답 정보</param>
        protected virtual void ExecuteProcedure(XdsRequestItem request, XdsResponseDocument responseDocument)
        {
            if (IsDebugEnabled)
            {
                log.Debug("프로시저를 실행합니다... requestId=[{0}], procedure=[{1}], requestType=[{2}], responseType=[{3}]",
                          request.Id, request.Query, request.RequestKind, request.ResponseKind);
            }
            try {
                var maxSequence = Math.Max(1, request.Values.Count);
                for (var seqId = 0; seqId < maxSequence; seqId++)
                {
                    var adoParameters = PrepareParameters(request, seqId).ToArray();

                    using (var cmd = Ado.GetProcedureCommand(request.Query)) {
                        Ado.ExecuteNonQuery(cmd, adoParameters);
                        var response = responseDocument.AddResponseItem(XmlDataResponseKind.Scalar, request.Id, seqId);
                        ExtractParameters(AdoTool.GetOutputParameters(Ado.Db, cmd), response, seqId);
                    }
                }
            }
            catch (Exception ex) {
                if (log.IsErrorEnabled)
                {
                    log.ErrorException(string.Format("프로시저 실행에 실패했습니다. procedure=[{0}]", request.Query), ex);
                }
                throw;
            }

            if (IsDebugEnabled)
            {
                log.Debug("프로시저 실행에 성공했습니다. procedure=[{0}]", request.Query);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// 요청정보 중에 RequestType이 <see cref="XmlDataRequestKind.Method"/> 인 경우에는 Method를 실제 실행할 Query 문장으로 변경한다.
        /// </summary>
        /// <param name="repository"><see cref="IIniQueryProvider"/>를 가진 기본 <see cref="IAdoRepository"/></param>
        /// <param name="request">요청 정보</param>
        public static void ConvertToQuery(IAdoRepository repository, XdsRequestItem request)
        {
            repository.ShouldNotBeNull("repository");
            request.ShouldNotBeNull("request");

            if (IsDebugEnabled)
            {
                log.Debug("요청정보의 Method에 해당하는 실제 Query String을 읽어옵니다.");
            }

            if (repository.QueryProvider == null)
            {
                if (IsDebugEnabled)
                {
                    log.Debug("AdoRepository.QueryProvider가 제공되지 않아, 조회 작업이 취소되었습니다.");
                }

                return;
            }

            foreach (XdsQuery query in request.PreQueries)
            {
                if (query.RequestKind == XmlDataRequestKind.Method)
                {
                    query.Query       = repository.QueryProvider.GetQuery(query.Query);
                    query.RequestKind = AdoTool.IsSqlString(query.Query)
                                            ? XmlDataRequestKind.Query
                                            : XmlDataRequestKind.StoredProc;
                }
            }

            if (request.RequestKind == XmlDataRequestKind.Method)
            {
                request.Query       = repository.QueryProvider.GetQuery(request.Query);
                request.RequestKind = AdoTool.IsSqlString(request.Query)
                                          ? XmlDataRequestKind.Query
                                          : XmlDataRequestKind.StoredProc;
            }

            foreach (XdsQuery query in request.PostQueries)
            {
                if (query.RequestKind == XmlDataRequestKind.Method)
                {
                    query.Query       = repository.QueryProvider.GetQuery(query.Query);
                    query.RequestKind = AdoTool.IsSqlString(query.Query)
                                            ? XmlDataRequestKind.Query
                                            : XmlDataRequestKind.StoredProc;
                }
            }

            if (IsDebugEnabled)
            {
                log.Debug("요청 정보의 Method에 해당하는 실제 Query String을 모두 읽었습니다.");
            }
        }
Exemplo n.º 3
0
 /// <summary>
 /// Parameter로 정의된 요소와 실제 Parameter에 대응할 값의 갯수를 비교해서 다르다면 예외를 발생시킨다.
 /// </summary>
 /// <param name="requestItem">요청항목</param>
 /// <param name="value"></param>
 private static void CheckParmeterAndArguments(XdsRequestItem requestItem, XdsValue value)
 {
     if (requestItem.Parameters.Count != value.Arguments.Count)
     {
         throw
             new InvalidOperationException(
                 string.Format("요청정보 (Id=[{0}]]) 의 인자정보[{1}]번째  파라미터 갯수[{2}]와 값의 갯수[{3}]가 틀립니다.",
                               requestItem.Id,
                               requestItem.Id,
                               requestItem.Parameters.Count,
                               value.Arguments.Count));
     }
 }
Exemplo n.º 4
0
        /// <summary>
        /// 요청정보중에 확인을 위해 응답정보에 조건들을 기록해둔다.
        /// </summary>
        /// <param name="request"></param>
        /// <param name="responseDocument"></param>
        private static void WriteRequestInfomation(XdsRequestItem request, XdsResponseDocument responseDocument)
        {
            var index = responseDocument.Responses.Count - 1;

            if (index >= 0)
            {
                responseDocument[index].PageSize         = request.PageSize;
                responseDocument[index].PageNo           = request.PageNo;
                responseDocument[index].Sort             = request.Sort;
                responseDocument[index].TotalRecordCount = responseDocument[index].Records.Count;

                if (responseDocument[index].PageSize > 0)
                {
                    responseDocument[index].PageCount = responseDocument[index].TotalRecordCount / responseDocument[index].PageSize + 1;
                }
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// 일반 Query문을 수행하여 DataSet을 받아서 ResponseDom 객체를 만든다.
        /// </summary>
        /// <param name="request">요청 항목</param>
        /// <param name="responseDocument">응답 정보</param>
        protected virtual void OpenQuery(XdsRequestItem request, XdsResponseDocument responseDocument)
        {
            request.ShouldNotBeNull("request");

            if (IsDebugEnabled)
            {
                log.Debug("쿼리문을 수행하여 결과셋을 얻습니다... request Id=[{0}], query=[{1}], requestType=[{2}], responseType=[{3}], sort=[{4}]",
                          request.Id, request.Query, request.RequestKind, request.ResponseKind, request.Sort);
            }

            try {
                var maxSequence = Math.Max(1, request.Values.Count);

                for (var seqId = 0; seqId < maxSequence; seqId++)
                {
                    var adoParameters = PrepareParameters(request, seqId).ToArray();

                    using (var cmd = Ado.GetCommand(request.Query))
                        using (var pagingTable = Ado.ExecutePagingDataTable(cmd,
                                                                            Math.Max(0, request.PageNo - 1),
                                                                            request.PageSize,
                                                                            adoParameters))
                            using (var dv = pagingTable.Table.DefaultView) {
                                if (request.Sort.IsNotWhiteSpace())
                                {
                                    dv.Sort = request.Sort;
                                }

                                responseDocument.Responses.AddResponseItem(dv, request.Id, seqId);
                            }
                }
            }
            catch (Exception ex) {
                if (log.IsErrorEnabled)
                {
                    log.ErrorException(string.Format("쿼리문을 수행하여 결과셋을 얻는데 실패했습니다. query=[{0}]", request.Query), ex);
                }

                throw;
            }

            if (IsDebugEnabled)
            {
                log.Debug("쿼리문을 수행하여 결과셋을 얻는데 성공했습니다. query=[{0}]", request.Query);
            }
        }
Exemplo n.º 6
0
        /// <summary>
        /// 일반 SQL Query 문 중에 DDL 과 관련된 문장을 수행한다. (결과 SET이 필요없는 것)
        /// </summary>
        /// <param name="request">요청 항목</param>
        /// <param name="responseDocument">응답 정보</param>
        protected virtual void ExecuteQuery(XdsRequestItem request, XdsResponseDocument responseDocument)
        {
            if (IsDebugEnabled)
            {
                log.Debug("쿼리문장을 실행합니다... requestId=[{0}], queryString=[{1}], requestType=[{2}], responseType=[{3}]",
                          request.Id, request.Query, request.RequestKind, request.ResponseKind);
            }
            try {
                var isScalar    = request.ResponseKind == XmlDataResponseKind.Scalar;
                var maxSequence = Math.Max(1, request.Values.Count);

                for (var seqId = 0; seqId < maxSequence; seqId++)
                {
                    var adoParameters = PrepareParameters(request, seqId).ToArray();

                    using (var cmd = Ado.GetSqlStringCommand(request.Query)) {
                        var result = (isScalar)
                                         ? Ado.ExecuteScalar(cmd, adoParameters)
                                         : Ado.ExecuteNonQuery(cmd, adoParameters);

                        var responseItem = responseDocument.AddResponseItem(request.ResponseKind, request.Id, seqId);

                        if (isScalar)
                        {
                            responseItem.Fields.AddField("RETURN_VALUE", typeof(int).Name, 4);
                            responseItem.Records.AddColumnArray(result);
                        }
                    }
                }
            }
            catch (Exception ex) {
                if (log.IsErrorEnabled)
                {
                    log.ErrorException(string.Format("쿼리 문 실행에 실패했습니다. query=[{0}]", request.Query), ex);
                }
                throw;
            }

            if (IsDebugEnabled)
            {
                log.Debug("쿼리문 실행에 성공했습니다. query=[{0}]", request.Query);
            }
        }
Exemplo n.º 7
0
        /// <summary>
        /// <paramref name="request"/> 요청에 대해, 처리를 수행합니다.
        /// </summary>
        /// <param name="request">요청항목</param>
        /// <param name="responseDocument">응답 정보</param>
        protected void DoProcessRequestItem(XdsRequestItem request, XdsResponseDocument responseDocument)
        {
            request.ShouldNotBeNull("request");

            var isDataSet = (request.ResponseKind == XmlDataResponseKind.DataSet);

            switch (request.RequestKind)
            {
            case XmlDataRequestKind.StoredProc:

                if (isDataSet)
                {
                    OpenProcedure(request, responseDocument);
                }
                else
                {
                    ExecuteProcedure(request, responseDocument);
                }
                break;

            case XmlDataRequestKind.Query:

                if (isDataSet)
                {
                    OpenQuery(request, responseDocument);
                }
                else
                {
                    ExecuteQuery(request, responseDocument);
                }
                break;

            default:
                throw new NotSupportedException("지원하지 않는 요청 종류입니다. RequestType=" + request.RequestKind);
            }

            // 요청정보중에 확인을 위해 응답정보에 조건들을 기록해둔다.
            //
            if (isDataSet)
            {
                WriteRequestInfomation(request, responseDocument);
            }
        }
Exemplo n.º 8
0
        /// <summary>
        /// DbCommand 인스턴스의 Parameters 컬렉션 속성에 값을 설정한다.
        /// </summary>
        /// <param name="requestItem">XdsRequestItem 개체 - Stored Procedure 호출에 필요한 파라미터 정보와 Value값이 있다.</param>
        /// <param name="requestIndex">RclXdsRequest의 요청 인덱스</param>
        protected static IList <IAdoParameter> PrepareParameters(XdsRequestItem requestItem, int requestIndex)
        {
            var adoParameters = new List <IAdoParameter>();

            var skipPrepareParams = requestItem.Parameters.Count == 0 || requestItem.Values.Count == 0;

            if (skipPrepareParams)
            {
                return(adoParameters);
            }

            var value = requestItem.Values[requestIndex];

            CheckParmeterAndArguments(requestItem, value);

            for (var i = 0; i < value.Arguments.Count; i++)
            {
                var xp = requestItem.Parameters[i];
                adoParameters.Add(new AdoParameter(xp.ParamName, value.Arguments[i].Argument));
            }
            return(adoParameters);
        }
Exemplo n.º 9
0
        /// <summary>
        /// 요청정보 중에 RequestType이 <see cref="XmlDataRequestKind.Method"/> 인 경우에는 Method를 실제 실행할 Query 문장으로 변경한다.
        /// </summary>
        /// <param name="repository"><see cref="IIniQueryProvider"/>를 가진 기본 <see cref="IAdoRepository"/></param>
        /// <param name="request">요청 정보</param>
        public static void ConvertToQuery(IAdoRepository repository, XdsRequestItem request) {
            repository.ShouldNotBeNull("repository");
            request.ShouldNotBeNull("request");

            if(IsDebugEnabled)
                log.Debug("요청정보의 Method에 해당하는 실제 Query String을 읽어옵니다.");

            if(repository.QueryProvider == null) {
                if(IsDebugEnabled)
                    log.Debug("AdoRepository.QueryProvider가 제공되지 않아, 조회 작업이 취소되었습니다.");

                return;
            }

            foreach(XdsQuery query in request.PreQueries) {
                if(query.RequestKind == XmlDataRequestKind.Method) {
                    query.Query = repository.QueryProvider.GetQuery(query.Query);
                    query.RequestKind = AdoTool.IsSqlString(query.Query)
                                            ? XmlDataRequestKind.Query
                                            : XmlDataRequestKind.StoredProc;
                }
            }

            if(request.RequestKind == XmlDataRequestKind.Method) {
                request.Query = repository.QueryProvider.GetQuery(request.Query);
                request.RequestKind = AdoTool.IsSqlString(request.Query)
                                          ? XmlDataRequestKind.Query
                                          : XmlDataRequestKind.StoredProc;
            }

            foreach(XdsQuery query in request.PostQueries) {
                if(query.RequestKind == XmlDataRequestKind.Method) {
                    query.Query = repository.QueryProvider.GetQuery(query.Query);
                    query.RequestKind = AdoTool.IsSqlString(query.Query)
                                            ? XmlDataRequestKind.Query
                                            : XmlDataRequestKind.StoredProc;
                }
            }

            if(IsDebugEnabled)
                log.Debug("요청 정보의 Method에 해당하는 실제 Query String을 모두 읽었습니다.");
        }
Exemplo n.º 10
0
 /// <summary>
 /// Parameter로 정의된 요소와 실제 Parameter에 대응할 값의 갯수를 비교해서 다르다면 예외를 발생시킨다.
 /// </summary>
 /// <param name="requestItem">요청항목</param>
 /// <param name="value"></param>
 private static void CheckParmeterAndArguments(XdsRequestItem requestItem, XdsValue value) {
     if(requestItem.Parameters.Count != value.Arguments.Count) {
         throw
             new InvalidOperationException(
                 string.Format("요청정보 (Id=[{0}]]) 의 인자정보[{1}]번째  파라미터 갯수[{2}]와 값의 갯수[{3}]가 틀립니다.",
                               requestItem.Id,
                               requestItem.Id,
                               requestItem.Parameters.Count,
                               value.Arguments.Count));
     }
 }
Exemplo n.º 11
0
        /// <summary>
        /// DbCommand 인스턴스의 Parameters 컬렉션 속성에 값을 설정한다.
        /// </summary>
        /// <param name="requestItem">XdsRequestItem 개체 - Stored Procedure 호출에 필요한 파라미터 정보와 Value값이 있다.</param>
        /// <param name="requestIndex">RclXdsRequest의 요청 인덱스</param>
        protected static IList<IAdoParameter> PrepareParameters(XdsRequestItem requestItem, int requestIndex) {
            var adoParameters = new List<IAdoParameter>();

            var skipPrepareParams = requestItem.Parameters.Count == 0 || requestItem.Values.Count == 0;

            if(skipPrepareParams)
                return adoParameters;

            var value = requestItem.Values[requestIndex];
            CheckParmeterAndArguments(requestItem, value);

            for(var i = 0; i < value.Arguments.Count; i++) {
                var xp = requestItem.Parameters[i];
                adoParameters.Add(new AdoParameter(xp.ParamName, value.Arguments[i].Argument));
            }
            return adoParameters;
        }
Exemplo n.º 12
0
        /// <summary>
        /// 요청정보중에 확인을 위해 응답정보에 조건들을 기록해둔다.
        /// </summary>
        /// <param name="request"></param>
        /// <param name="responseDocument"></param>
        private static void WriteRequestInfomation(XdsRequestItem request, XdsResponseDocument responseDocument) {
            var index = responseDocument.Responses.Count - 1;

            if(index >= 0) {
                responseDocument[index].PageSize = request.PageSize;
                responseDocument[index].PageNo = request.PageNo;
                responseDocument[index].Sort = request.Sort;
                responseDocument[index].TotalRecordCount = responseDocument[index].Records.Count;

                if(responseDocument[index].PageSize > 0)
                    responseDocument[index].PageCount = responseDocument[index].TotalRecordCount / responseDocument[index].PageSize + 1;
            }
        }
Exemplo n.º 13
0
        /// <summary>
        /// 일반 Query문을 수행하여 DataSet을 받아서 ResponseDom 객체를 만든다.
        /// </summary>
        /// <param name="request">요청 항목</param>
        /// <param name="responseDocument">응답 정보</param>
        protected virtual void OpenQuery(XdsRequestItem request, XdsResponseDocument responseDocument) {
            request.ShouldNotBeNull("request");

            if(IsDebugEnabled)
                log.Debug("쿼리문을 수행하여 결과셋을 얻습니다... request Id=[{0}], query=[{1}], requestType=[{2}], responseType=[{3}], sort=[{4}]",
                          request.Id, request.Query, request.RequestKind, request.ResponseKind, request.Sort);

            try {
                var maxSequence = Math.Max(1, request.Values.Count);

                for(var seqId = 0; seqId < maxSequence; seqId++) {
                    var adoParameters = PrepareParameters(request, seqId).ToArray();

                    using(var cmd = Ado.GetCommand(request.Query))
                    using(var pagingTable = Ado.ExecutePagingDataTable(cmd,
                                                                       Math.Max(0, request.PageNo - 1),
                                                                       request.PageSize,
                                                                       adoParameters))
                    using(var dv = pagingTable.Table.DefaultView) {
                        if(request.Sort.IsNotWhiteSpace())
                            dv.Sort = request.Sort;

                        responseDocument.Responses.AddResponseItem(dv, request.Id, seqId);
                    }
                }
            }
            catch(Exception ex) {
                if(log.IsErrorEnabled)
                    log.ErrorException(string.Format("쿼리문을 수행하여 결과셋을 얻는데 실패했습니다. query=[{0}]", request.Query), ex);

                throw;
            }

            if(IsDebugEnabled)
                log.Debug("쿼리문을 수행하여 결과셋을 얻는데 성공했습니다. query=[{0}]", request.Query);
        }
Exemplo n.º 14
0
        /// <summary>
        /// 일반 SQL Query 문 중에 DDL 과 관련된 문장을 수행한다. (결과 SET이 필요없는 것)
        /// </summary>
        /// <param name="request">요청 항목</param>
        /// <param name="responseDocument">응답 정보</param>
        protected virtual void ExecuteQuery(XdsRequestItem request, XdsResponseDocument responseDocument) {
            if(IsDebugEnabled)
                log.Debug("쿼리문장을 실행합니다... requestId=[{0}], queryString=[{1}], requestType=[{2}], responseType=[{3}]",
                          request.Id, request.Query, request.RequestKind, request.ResponseKind);
            try {
                var isScalar = request.ResponseKind == XmlDataResponseKind.Scalar;
                var maxSequence = Math.Max(1, request.Values.Count);

                for(var seqId = 0; seqId < maxSequence; seqId++) {
                    var adoParameters = PrepareParameters(request, seqId).ToArray();

                    using(var cmd = Ado.GetSqlStringCommand(request.Query)) {
                        var result = (isScalar)
                                         ? Ado.ExecuteScalar(cmd, adoParameters)
                                         : Ado.ExecuteNonQuery(cmd, adoParameters);

                        var responseItem = responseDocument.AddResponseItem(request.ResponseKind, request.Id, seqId);

                        if(isScalar) {
                            responseItem.Fields.AddField("RETURN_VALUE", typeof(int).Name, 4);
                            responseItem.Records.AddColumnArray(result);
                        }
                    }
                }
            }
            catch(Exception ex) {
                if(log.IsErrorEnabled)
                    log.ErrorException(string.Format("쿼리 문 실행에 실패했습니다. query=[{0}]", request.Query), ex);
                throw;
            }

            if(IsDebugEnabled)
                log.Debug("쿼리문 실행에 성공했습니다. query=[{0}]", request.Query);
        }
Exemplo n.º 15
0
        /// <summary>
        /// Stored Procedure를 수행하고, OUTPUT, RETURN_VALUE를 반환한다.
        /// </summary>
        /// <param name="request">요청 항목</param>
        /// <param name="responseDocument">응답 정보</param>
        protected virtual void ExecuteProcedure(XdsRequestItem request, XdsResponseDocument responseDocument) {
            if(IsDebugEnabled)
                log.Debug("프로시저를 실행합니다... requestId=[{0}], procedure=[{1}], requestType=[{2}], responseType=[{3}]",
                          request.Id, request.Query, request.RequestKind, request.ResponseKind);
            try {
                var maxSequence = Math.Max(1, request.Values.Count);
                for(var seqId = 0; seqId < maxSequence; seqId++) {
                    var adoParameters = PrepareParameters(request, seqId).ToArray();

                    using(var cmd = Ado.GetProcedureCommand(request.Query)) {
                        Ado.ExecuteNonQuery(cmd, adoParameters);
                        var response = responseDocument.AddResponseItem(XmlDataResponseKind.Scalar, request.Id, seqId);
                        ExtractParameters(AdoTool.GetOutputParameters(Ado.Db, cmd), response, seqId);
                    }
                }
            }
            catch(Exception ex) {
                if(log.IsErrorEnabled)
                    log.ErrorException(string.Format("프로시저 실행에 실패했습니다. procedure=[{0}]", request.Query), ex);
                throw;
            }

            if(IsDebugEnabled)
                log.Debug("프로시저 실행에 성공했습니다. procedure=[{0}]", request.Query);
        }
Exemplo n.º 16
0
        /// <summary>
        /// <paramref name="request"/> 요청에 대해, 처리를 수행합니다.
        /// </summary>
        /// <param name="request">요청항목</param>
        /// <param name="responseDocument">응답 정보</param>
        protected void DoProcessRequestItem(XdsRequestItem request, XdsResponseDocument responseDocument) {
            request.ShouldNotBeNull("request");

            var isDataSet = (request.ResponseKind == XmlDataResponseKind.DataSet);

            switch(request.RequestKind) {
                case XmlDataRequestKind.StoredProc:

                    if(isDataSet)
                        OpenProcedure(request, responseDocument);
                    else
                        ExecuteProcedure(request, responseDocument);
                    break;

                case XmlDataRequestKind.Query:

                    if(isDataSet)
                        OpenQuery(request, responseDocument);
                    else
                        ExecuteQuery(request, responseDocument);
                    break;

                default:
                    throw new NotSupportedException("지원하지 않는 요청 종류입니다. RequestType=" + request.RequestKind);
            }

            // 요청정보중에 확인을 위해 응답정보에 조건들을 기록해둔다.
            //
            if(isDataSet)
                WriteRequestInfomation(request, responseDocument);
        }