/// <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); } }
/// <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을 모두 읽었습니다."); } }
/// <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)); } }
/// <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; } } }
/// <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); } }
/// <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); } }
/// <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); } }
/// <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); }
/// <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을 모두 읽었습니다."); }
/// <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)); } }
/// <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; }
/// <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; } }
/// <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); }
/// <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); }
/// <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); }
/// <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); }