protected override ResponseItem DoProcessRequestItem(RequestItem requestItem) { if(log.IsDebugEnabled) log.Debug("요청 Id=[{0}], Method=[{1}], Query=[{2}]에 대한 작업 처리를 시작합니다.", requestItem.Id, requestItem.Method, requestItem.Query); var responseItem = new ResponseItem(requestItem); if(requestItem.Query.IsWhiteSpace()) return responseItem; if(IsDebugEnabled) log.Debug("요청정보를 처리합니다. 메소드=[{0}], 인자=[{1}]", requestItem.Method, requestItem.Parameters.CollectionToString()); try { var command = DataCommandTool.GetCommand(requestItem.Method); Guard.Assert(command != null, "해당하는 메소드에 정의된 Command 가 없습니다. method=[{0}]", requestItem.Method); ExecuteQueries(requestItem.PreQueries); responseItem.ResultValue = command.Execute(AdoRepository, requestItem); if(IsDebugEnabled) log.Debug("메소드를 실행했습니다. method=[{0}], resultValue=[{1}]", requestItem.Method, responseItem.ResultValue); ExecuteQueries(requestItem.PostQueries); } catch(Exception ex) { if(log.IsErrorEnabled) log.ErrorException("쿼리문 수행에 실패했습니다. Query=" + requestItem.Query, ex); responseItem.Errors.Add(new ErrorMessage(ex)); } if(log.IsDebugEnabled) log.Debug("요청 Id=[{0}], Method=[{1}], Query=[{2}]에 대한 작업 처리를 완료했습니다!!!", requestItem.Id, requestItem.Method, requestItem.Query); return responseItem; }
/// <summary> /// 요청 쿼리 문을 수행하는데, /// <see cref="IAdoRepository.ExecuteNonQuery(string,IAdoParameter[])" /> 나 /// <see cref="IAdoRepository.ExecuteScalar(string,IAdoParameter[])"/> 를 실행합니다. /// </summary> /// <param name="requestItem"></param> /// <param name="responseItem"></param> /// <param name="adoParameters"></param> protected virtual void ExecuteQuery(RequestItem requestItem, ResponseItem responseItem, IAdoParameter[] adoParameters) { // Scalar 값 구하기 if(requestItem.ResponseFormat == ResponseFormatKind.Scalar) { if(IsDebugEnabled) log.Debug("ExecuteNonScalar 를 수행하여, ResultValue 값을 설정합니다..."); responseItem.ResultValue = AdoRepository.ExecuteScalar(requestItem.Query, adoParameters); return; } // 쿼리문이라면, 실행 var query = requestItem.Query; if(AdoTool.IsSqlString(query)) { if(IsDebugEnabled) log.Debug("ExecuteNonQuery 를 수행하고, 영향받은 행의 수를 ResultValue에 설정합니다..."); responseItem.ResultValue = AdoRepository.ExecuteNonQuery(requestItem.Query, adoParameters); return; } if(IsDebugEnabled) log.Debug("ExecuteProcedure를 수행하고, Parameter 정보들을 ResultSet에 설정합니다."); // Procedure 라면, Output Parameter 등을 ResultSet으로 반환함. //! 단 Procedure가 ResultSet을 반환해야 하는 경우는 OpenQuery를 수행할 수 있도록 ResponseFormat 을 ResponseFormatKind.ResultSet 으로 할 것 // var parameters = AdoRepository.ExecuteProcedure(query, adoParameters); if(parameters != null) { responseItem.ResultValue = parameters.GetReturnValue(); var row = new ResultRow(parameters.ToDictionary(p => p.Name, p => p.Value)); responseItem.ResultSet.Add(row); } }
/// <summary> /// 요청 쿼리 문을 수행하여, <see cref="ResultSet"/> 으로 빌드하여, 응답 결과를 적용합니다. /// </summary> protected virtual void OpenQuery(RequestItem requestItem, ResponseItem responseItem, IAdoParameter[] adoParameters) { if(IsDebugEnabled) log.Debug("쿼리문을 수행하여 결과셋을 설정합니다..."); using(var cmd = AdoRepository.GetCommand(requestItem.Query)) { var reader = AdoRepository.ExecuteReader(cmd, adoParameters); var resultSet = reader.CreateResultSet(NameMapper, requestItem.FirstResult.GetValueOrDefault(), requestItem.MaxResults.GetValueOrDefault(int.MaxValue)); responseItem.ResultSet = resultSet; } }
protected virtual ResponseItem DoProcessRequestItem(RequestItem requestItem) { if(log.IsDebugEnabled) log.Debug("요청 Id=[{0}], Method=[{1}], Query=[{2}]에 대한 작업 처리를 시작합니다.", requestItem.Id, requestItem.Method, requestItem.Query); var stopwatch = new Stopwatch(); stopwatch.Start(); var responseItem = new ResponseItem(requestItem); if(requestItem.Query.IsWhiteSpace()) return responseItem; try { ExecuteQueries(requestItem.PreQueries); var adoParams = requestItem.BuildAdoParameters().ToArray(); if(requestItem.ResponseFormat == ResponseFormatKind.ResultSet) OpenQuery(requestItem, responseItem, adoParams); else ExecuteQuery(requestItem, responseItem, adoParams); ExecuteQueries(requestItem.PostQueries); } catch(Exception ex) { if(log.IsErrorEnabled) log.ErrorException("쿼리문 수행에 실패했습니다. Query=" + requestItem.Query, ex); responseItem.Errors.Add(new ErrorMessage(ex)); } stopwatch.Stop(); responseItem.ExecutionTime = stopwatch.Elapsed; if(log.IsDebugEnabled) log.Debug("요청 Id=[{0}], Method=[{1}], Query=[{2}]에 대한 작업 처리를 완료했습니다!!! 수행시간=[{3}]", requestItem.Id, requestItem.Method, requestItem.Query, responseItem.ExecutionTime); return responseItem; }