public object Save(DataTable dtM, bool 타메뉴호출) { SpInfoCollection sic = new SpInfoCollection(); SpInfo si; if (dtM != null) { si = new SpInfo(); /* * if (!타메뉴호출) * si.DataState = DataValueState.Added; * else * si.DataState = DataValueState.Modified; */ si.DataValue = dtM; si.CompanyID = 회사코드; si.UserID = 사용자ID; si.SpNameInsert = "UP_CZ_ME_MAP_DEPT_IU"; si.SpNameUpdate = "UP_CZ_ME_MAP_DEPT_IU"; si.SpNameDelete = "UP_CZ_ME_MAP_DEPT_D"; si.SpParamsInsert = new string[] { "CD_COMPANY", "CD_DEPT_MTS", "NM_DEPT_MTS", "CD_DEPT", "NM_DEPT", "NO_APPLY", "CD_CC", "DT_START" }; si.SpParamsUpdate = new string[] { "CD_COMPANY", "CD_DEPT_MTS", "NM_DEPT_MTS", "CD_DEPT", "NM_DEPT", "NO_APPLY", "CD_CC", "DT_START" }; si.SpParamsDelete = new string[] { "CD_COMPANY", "CD_DEPT" }; sic.Add(si); } return(Global.MainFrame.Save(sic)); }
public object Save_t2(DataTable dtM, bool 타메뉴호출) { SpInfoCollection sic = new SpInfoCollection(); SpInfo si; if (dtM != null) { si = new SpInfo(); /* * if (!타메뉴호출) * si.DataState = DataValueState.Added; * else * si.DataState = DataValueState.Modified; */ si.DataValue = dtM; si.CompanyID = 회사코드; si.UserID = 사용자ID; si.SpNameInsert = "UP_CZ_ME_MAP_PARTNER_T2_IU"; si.SpNameUpdate = "UP_CZ_ME_MAP_PARTNER_T2_IU"; si.SpParamsInsert = new string[] { "CD_COMPANY", "me_type", "me_attr", "me_sumcode", "corpflag", "corpid", "ID_INSERT" }; si.SpParamsUpdate = new string[] { "CD_COMPANY", "me_type", "me_attr", "me_sumcode", "corpflag", "corpid", "ID_UPDATE" }; sic.Add(si); } return(Global.MainFrame.Save(sic)); }
public object Save(DataTable dtM, DataTable dtD, bool 타메뉴호출) { SpInfoCollection sic = new SpInfoCollection(); SpInfo si; if (dtM != null) { si = new SpInfo(); if (!타메뉴호출) { si.DataState = DataValueState.Added; } else { si.DataState = DataValueState.Modified; } si.DataValue = dtM; si.CompanyID = 회사코드; si.UserID = 사용자ID; si.SpNameInsert = "UP_CZ_MEZZO_SALESGR_H_I"; si.SpNameUpdate = "UP_CZ_MEZZO_SALESGR_H_U"; si.SpParamsInsert = new string[] { "NO_IV", "CD_COMPANY", "CD_BIZAREA", "NO_BIZAREA", "FG_TPPURCHASE", "CD_PARTNER", "FG_TRANS", "AM_K", "VAT_TAX", "RT_EXCH", "CD_EXCH", "AM_EX", "DT_PROCESS", "FG_TAX", "CD_DEPT", "NO_EMP", "YN_PURSUB", "YN_EXPIV", "ID_INSERT", "DC_RMK", "FG_PAYBILL", "DT_PAY_PREARRANGED", "CD_BIZAREA_TAX", "YN_JEONJA", "CD_PC_USER", "NO_DEPOSIT", "TXT_USERDEF1", "TP_SUMTAX", "TP_EVIDENCE" }; si.SpParamsUpdate = new string[] { "NO_IV", "CD_COMPANY", "CD_BIZAREA", "NO_BIZAREA", "FG_TPPURCHASE", "CD_PARTNER", "FG_TRANS", "AM_K", "VAT_TAX", "RT_EXCH", "CD_EXCH", "AM_EX", "DT_PROCESS", "FG_TAX", "CD_DEPT", "NO_EMP", "YN_PURSUB", "YN_EXPIV", "ID_UPDATE", "DC_RMK", "FG_PAYBILL", "DT_PAY_PREARRANGED", "CD_BIZAREA_TAX", "YN_JEONJA", "CD_PC_USER", "NO_DEPOSIT", "TXT_USERDEF1", "TP_SUMTAX", "TP_EVIDENCE" }; sic.Add(si); } if (dtD != null) { SpInfo si1 = new SpInfo(); si1 = new Duzon.Common.Util.SpInfo(); //if (!타메뉴호출) // si1.DataState = DataValueState.Added; si1.DataValue = dtD; si1.CompanyID = 회사코드; si1.UserID = 사용자ID; si1.SpNameInsert = "UP_CZ_MEZZO_SALESGR_D_I"; si1.SpParamsInsert = new string[] { "NO_IV", "NO_IVLINE", "CD_COMPANY", "CD_PLANT", "NO_IO", "CD_ITEM", "CD_PURGRP", "DT_TAX", "UM", "AM_IV", "VAT_IV", "NO_EMP", "CD_PJT", "FG_TPPURCHASE", "NO_PO", "CD_EXCH", "RT_EXCH", "UM_EX", "AM_EX", "QT_CLS", "NO_WBS", "NO_CBS", "TP_UM_TAX", "MEMO_CD", "CHECK_PEN", "REMARK", "ACCT_NO", "BANK_CODE", "TRADE_DATE", "TRADE_TIME", "SEQ", "YN_CAL", "CD_ITEM_PARENTS", "CD_BUDGET", "TP_CAL", "CD_NATION", "FG_TAX", "TRADE_PLACE", "ID_INSERT" }; sic.Add(si1); } return(Global.MainFrame.Save(sic)); }
public object Save(DataTable dtM, bool 타메뉴호출) { SpInfoCollection sic = new SpInfoCollection(); SpInfo si; if (dtM != null) { si = new SpInfo(); /* * if (!타메뉴호출) * si.DataState = DataValueState.Added; * else * si.DataState = DataValueState.Modified; */ si.DataValue = dtM; si.CompanyID = 회사코드; si.UserID = 사용자ID; si.SpNameInsert = "UP_CZ_ME_SALES_FOR_I"; si.SpNameUpdate = "UP_CZ_ME_SALES_FOR_U"; si.SpNameDelete = "UP_CZ_ME_SALES_FOR_D"; si.SpParamsInsert = new string[] { "CD_COMPANY", "TP_SALES", "MER_REQ_NO", "ME_CPID", "NM_CPID", "ME_SEQ" , "AY_AGENCYID", "AY_YEAR_MONTH", "AY_TRADE_TYPE", "ME_CORPID", "ME_YEAR_MONTH" , "ME_TRADE_TYPE", "CD_SYSDEF", "CD_ACCT", "ME_TEAMID", "AM_BUDGET" , "AM_INCOME", "AM_AGY_PRICE", "AM_MEDIA_PRICE", "ID_INSERT", "ID_UPDATE" , "DT_YEAR" }; si.SpParamsUpdate = new string[] { "CD_COMPANY", "TP_SALES", "MER_REQ_NO", "ME_CPID", "NM_CPID", "ME_SEQ" , "AY_AGENCYID", "AY_YEAR_MONTH", "AY_TRADE_TYPE", "ME_CORPID", "ME_YEAR_MONTH" , "ME_TRADE_TYPE", "CD_SYSDEF", "CD_ACCT", "ME_TEAMID", "AM_BUDGET" , "AM_INCOME", "AM_AGY_PRICE", "AM_MEDIA_PRICE", "ID_INSERT", "ID_UPDATE" , "DT_YEAR" }; si.SpParamsDelete = new string[] { "CD_COMPANY", "TP_SALES", "MER_REQ_NO", "ME_CPID", "ME_SEQ" }; sic.Add(si); } return(Global.MainFrame.Save(sic)); }
private bool IsReadScale(SpInfo spInfo, UserSession userSession, InvokeOptionsInternal spi, out bool isWriteMode) { //Select ReadOnly Or Write Connection var dataAccessMode = spInfo.ExtendedProps != null ? spInfo.ExtendedProps.DataAccessMode : SpDataAccessMode.Write; //Write procedures cannot be called in ForceReadOnly anyway if (spi.IsForceReadOnly && dataAccessMode == SpDataAccessMode.Write) { throw new SpMaintenanceReadOnlyException(spInfo.ProcedureName); } //Set write request isWriteMode = !spi.IsForceReadOnly && dataAccessMode == SpDataAccessMode.Write; // Find connection string var isReadScale = spi.IsForceReadOnly || dataAccessMode == SpDataAccessMode.ReadSnapshot || (dataAccessMode == SpDataAccessMode.Read && userSession.LastWriteTime.AddSeconds(_readonlyConnectionSyncInterval) < DateTime.Now); return(isReadScale); }
public object Save(DataTable dtM, bool 타메뉴호출) { SpInfoCollection sic = new SpInfoCollection(); SpInfo si; string DEPT_CODE = Global.MainFrame.LoginInfo.DeptCode; if (dtM != null) { si = new SpInfo(); /* * if (!타메뉴호출) * si.DataState = DataValueState.Added; * else * si.DataState = DataValueState.Modified; */ si.DataValue = dtM; si.CompanyID = 회사코드; si.UserID = 사용자ID; si.SpNameInsert = "UP_CZ_ME_SALES_PUB_I"; si.SpNameUpdate = "UP_CZ_ME_SALES_PUB_I"; si.SpNameDelete = "UP_CZ_ME_SALES_PUB_D"; si.SpParamsInsert = new string[] { "CD_COMPANY", "TP_SALES", "MER_REQ_NO", "ME_CPID", "ME_SEQ" , "ME_CORPNO", "ME_YEAR_MONTH", "ME_TRADE_TYPE", "AM_BUDGET", "AM_AGY_PRICE" , "AM_MEDIA_PRICE", "NO_DOCU_M", "NO_DOCU_C", "ID_INSERT", "ID_UPDATE" }; si.SpParamsUpdate = new string[] { "CD_COMPANY", "TP_SALES", "MER_REQ_NO", "ME_CPID", "ME_SEQ" , "ME_CORPNO", "ME_YEAR_MONTH", "ME_TRADE_TYPE", "AM_BUDGET", "AM_AGY_PRICE" , "AM_MEDIA_PRICE", "NO_DOCU_M", "NO_DOCU_C", "ID_INSERT", "ID_UPDATE" }; si.SpParamsDelete = new string[] { "CD_COMPANY", "TP_SALES", "MER_REQ_NO", "ME_CPID", "ME_SEQ" }; sic.Add(si); } return(Global.MainFrame.Save(sic)); }
public object Save(DataTable dtM) { SpInfoCollection sic = new SpInfoCollection(); SpInfo si; if (dtM != null) { si = new SpInfo(); si.DataValue = dtM; si.CompanyID = 회사코드; si.UserID = 사용자ID; si.SpNameInsert = "UP_CZ_ME_SALES_I"; si.SpNameUpdate = "UP_CZ_ME_SALES_U"; si.SpParamsInsert = new string[] { "CD_COMPANY", "actyear", "CD_ACCT", "cpid", "cpname", "yearmonth" , "trade_type_d", "biz_no_d", "agencyid", "corpname_d", "yearmonth2" , "trade_type_m", "biz_no_m", "corpid", "corpname_m", "NM_MEDIAGR" , "teamid", "teamname", "budget", "agy_price", "income" , "corp_amt", "agentid", "agentname", "closed", "status" , "ID_INSERT", "ID_UPDATE" }; si.SpParamsUpdate = new string[] { "CD_COMPANY", "actyear", "CD_ACCT", "cpid", "cpname", "yearmonth" , "trade_type_d", "biz_no_d", "agencyid", "corpname_d", "yearmonth2" , "trade_type_m", "biz_no_m", "corpid", "corpname_m", "NM_MEDIAGR" , "teamid", "teamname", "budget", "agy_price", "income" , "corp_amt", "agentid", "agentname", "closed", "status" , "ID_INSERT", "ID_UPDATE" }; sic.Add(si); } return(Global.MainFrame.Save(sic)); }
private SpInfo ProcInfo_FromMethodInfo(MethodInfo methodInfo) { var paramsEx = new Dictionary <string, SpParamInfoEx>(); //add paramInfo var spParamInfos = new List <SpParamInfo>(); foreach (var paramInfo in methodInfo.GetParameters()) { spParamInfos.Add(ProcInfo_GetParamInfo(paramInfo, paramsEx)); } //add return value as an out parameter if (methodInfo.ReturnParameter.ParameterType != typeof(void)) { spParamInfos.Add(ProcInfo_GetParamInfo(methodInfo.ReturnParameter, paramsEx)); } // add method attributes var directSpAttribute = methodInfo.GetCustomAttribute <DirectSpProcAttribute>() ?? new DirectSpProcAttribute(); //create procedure infos var spInfo = new SpInfo { ProcedureName = methodInfo.Name, Params = spParamInfos.ToArray(), ExtendedProps = new SpInfoEx() { IsBatchAllowed = directSpAttribute.IsBatchAllowed, CaptchaMode = directSpAttribute.CaptchaMode, Params = paramsEx } }; return(spInfo); }
internal bool Save2(DataTable dt) { SpInfoCollection sc = new SpInfoCollection(); SpInfo si = null; if (dt != null && dt.Rows.Count != 0) { si = new SpInfo(); si.DataValue = dt; si.CompanyID = Global.MainFrame.LoginInfo.CompanyCode; si.UserID = Global.MainFrame.LoginInfo.EmployeeNo; si.SpNameInsert = "UP_CZ_ME_CALENDAR_I"; si.SpNameUpdate = "UP_CZ_ME_CALENDAR_U"; si.SpNameDelete = "UP_CZ_ME_CALENDAR_D"; si.SpParamsInsert = new string[] { "CD_COMPANY", "DT_CALENDAR", "TP_CALENDAR", "DT_ROW", "NO_EMP", "NM_TITLE", "NM_NOTE", "DT_INSERT", "DT_UPDATE", "HOLIDAY", "TM_START" }; si.SpParamsUpdate = new string[] { "CD_COMPANY", "DT_CALENDAR", "TP_CALENDAR", "DT_ROW", "NO_EMP", "NM_TITLE", "NM_NOTE", "DT_INSERT", "DT_UPDATE", "TM_START" }; si.SpParamsDelete = new string[] { "CD_COMPANY", "DT_ROW" }; sc.Add(si); } return(DBHelper.Save(sc)); }
internal void Save(DataTable dt) { if (dt == null || dt.Rows.Count == 0) { return; } SpInfo si = new SpInfo(); si.DataValue = dt; si.CompanyID = _CompanyCode; si.UserID = Global.MainFrame.LoginInfo.UserID; si.SpNameInsert = "SP_MA_CALENDAR_INSERT"; si.SpParamsInsert = new string[] { "TP_CAL", "CD_COMPANY", "DT_CAL", "TP_WEEK", "SEQ_CAL", "TP_JOB", "FG1_HOLIDAY", "FDATESEQ", "FDATENO", "NO_PERIOD", "DC_TEXT", "ID_INSERT" }; si.SpNameUpdate = "SP_MA_CALENDAR_UPDATE"; si.SpParamsUpdate = new string[] { "TP_CAL", "CD_COMPANY", "DT_CAL", "TP_WEEK", "SEQ_CAL", "TP_JOB", "FG1_HOLIDAY", "FDATESEQ", "FDATENO", "NO_PERIOD", "DC_TEXT", "ID_UPDATE" }; si.SpNameDelete = "SP_MA_CALENDAR_DELETE"; si.SpParamsDelete = new string[] { "TP_CAL", "CD_COMPANY", "DT_CAL" }; DBHelper.Save(si); }
internal bool Save(DataTable dtInvoice, DataTable dtFreight, List <string> list) { SpInfoCollection sc = new SpInfoCollection(); if (dtInvoice != null) { SpInfo si = new SpInfo(); si.DataValue = dtInvoice; si.FirmCode = Global.FirmCode; si.UserID = Global.UserID; si.SpNameInsert = "AP_INT_INVOICE_I"; si.SpNameUpdate = "AP_INT_INVOICE_I"; si.SpParamsInsert = new string[] { "CD_FIRM", "CD_BIZ", "NO_SLIP_INVOICE", "FG_INVOICE", "NO_INVOICE", "NM_MENU", "FG_REG_TYPE", "NO_INVOICE_REL", "NO_SLIP_INVOICE_AP", "CD_INVOICE_STATUS", "CD_PARTNER_BILL_TO", "NM_PARTNER_BILL_TO", "DC_PARTNER_BILL_TO_ADDR", "CD_PARTNER_SHIP_TO", "NM_PARTNER_SHIP_TO", "DC_PARTNER_SHIP_TO_ADDR", "DC_RMK", "DC_ATTN_TO", "CD_CURRENCY", "TM_INVOICE", "TM_INVOICE_DUE", "TM_INVOICE_POST", "TM_PAY_LAST", "TM_INVOICE_RECEIVED", "CD_CURRENCY_STANDARD", "RT_XCRT_STANDARD", "AM_INVOICE_STANDARD", "YN_INVOICE_RECEIVED", "CD_USER_REG" }; si.SpParamsUpdate = new string[] { "CD_FIRM", "CD_BIZ", "NO_SLIP_INVOICE", "FG_INVOICE", "NO_INVOICE", "NM_MENU", "FG_REG_TYPE", "NO_INVOICE_REL", "NO_SLIP_INVOICE_AP", "CD_INVOICE_STATUS", "CD_PARTNER_BILL_TO", "NM_PARTNER_BILL_TO", "DC_PARTNER_BILL_TO_ADDR", "CD_PARTNER_SHIP_TO", "NM_PARTNER_SHIP_TO", "DC_PARTNER_SHIP_TO_ADDR", "DC_RMK", "DC_ATTN_TO", "CD_CURRENCY", "TM_INVOICE", "TM_INVOICE_DUE", "TM_INVOICE_POST", "TM_PAY_LAST", "TM_INVOICE_RECEIVED", "CD_CURRENCY_STANDARD", "RT_XCRT_STANDARD", "AM_INVOICE_STANDARD", "YN_INVOICE_RECEIVED", "CD_USER_REG" }; sc.Add(si); } if (dtFreight != null) { SpInfo si = new SpInfo(); si.DataValue = dtFreight; si.FirmCode = Global.FirmCode; si.UserID = Global.UserID; si.SpNameInsert = "AP_INT_FREIGHT_I"; si.SpNameUpdate = "AP_INT_FREIGHT_U"; si.SpNameDelete = "AP_INT_FREIGHT_D"; si.SpParamsInsert = new string[] { "CD_FIRM", "CD_BIZ1", "NO_SLIP_INVOICE1", "SEQ_FREIGHT", "CD_FREIGHT", "NM_FREIGHT", "FG_REV_COST", "FG_FREIGHT_TERM", "CD_CURRENCY_INVOICE1", "CD_CURRENCY", "RT_XCRT", "FG_CALC", "QT_UNIT", "RT_UNIT", "RT_FREIGHT_VAT", "AM_FREIGHT", "AM_FREIGHT_VAT", "AM_FREIGHT_SUM", "AM_FREIGHT_COST", "AM_FREIGHT_VAT_COST", "AM_FREIGHT_SUM_COST", "NO_SLIP_BL1", "TM_INVOICE_POST", "CD_USER_REG", "NO_SLIP_PROGRESS_REL", "FG_FREIGHT_REL", "SEQ_PROGRESS_ACCT_INFO_REL" }; si.SpParamsUpdate = new string[] { "CD_FIRM", "CD_BIZ1", "NO_SLIP_INVOICE1", "SEQ_FREIGHT", "CD_FREIGHT", "NM_FREIGHT", "FG_REV_COST", "FG_FREIGHT_TERM", "CD_CURRENCY_INVOICE1", "CD_CURRENCY", "RT_XCRT", "FG_CALC", "QT_UNIT", "RT_UNIT", "RT_FREIGHT_VAT", "AM_FREIGHT", "AM_FREIGHT_VAT", "AM_FREIGHT_SUM", "AM_FREIGHT_COST", "AM_FREIGHT_VAT_COST", "AM_FREIGHT_SUM_COST", "NO_SLIP_BL1", "TM_INVOICE_POST", "CD_USER_AMD", "NO_SLIP_PROGRESS_REL", "FG_FREIGHT_REL", "SEQ_PROGRESS_ACCT_INFO_REL" }; si.SpParamsDelete = new string[] { "CD_FIRM", "CD_BIZ1", "NO_SLIP_INVOICE1", "SEQ_FREIGHT", "CD_USER_AMD" }; si.SpParamsValues.Add(NF.A2P.CommonFunction.SpState.Insert, "CD_BIZ1", list[0]); si.SpParamsValues.Add(NF.A2P.CommonFunction.SpState.Insert, "NO_SLIP_INVOICE1", list[1]); si.SpParamsValues.Add(NF.A2P.CommonFunction.SpState.Insert, "NO_SLIP_BL1", list[2]); //si.SpParamsValues.Add(NF.A2P.CommonFunction.SpState.Insert, "TM_INVOICE_POST1", list[3]); si.SpParamsValues.Add(NF.A2P.CommonFunction.SpState.Insert, "CD_CURRENCY_INVOICE1", list[3]); si.SpParamsValues.Add(NF.A2P.CommonFunction.SpState.Update, "CD_BIZ1", list[0]); si.SpParamsValues.Add(NF.A2P.CommonFunction.SpState.Update, "NO_SLIP_INVOICE1", list[1]); si.SpParamsValues.Add(NF.A2P.CommonFunction.SpState.Update, "NO_SLIP_BL1", list[2]); //si.SpParamsValues.Add(NF.A2P.CommonFunction.SpState.Update, "TM_INVOICE_POST1", list[3]); si.SpParamsValues.Add(NF.A2P.CommonFunction.SpState.Update, "CD_CURRENCY_INVOICE1", list[3]); si.SpParamsValues.Add(NF.A2P.CommonFunction.SpState.Delete, "CD_BIZ1", list[0]); si.SpParamsValues.Add(NF.A2P.CommonFunction.SpState.Delete, "NO_SLIP_INVOICE1", list[1]); sc.Add(si); } return(DBHelper.Save(sc)); }
private void ReadRecordset(SpCallResult spCallResult, CommandResultTable commandResultTable, SpInfo spInfo, ApiInvokeOptions invokeOptions) { // Build return recordsetFields var fieldInfos = new List <FieldInfo>(commandResultTable.Fields.Length); for (int i = 0; i < commandResultTable.Fields.Length; i++) { fieldInfos.Add(new FieldInfo() { Name = commandResultTable.Fields[i].Name, TypeName = commandResultTable.Fields[i].TypeName, ExtendedProps = spInfo.ExtendedProps.Fields.TryGetValue(commandResultTable.Fields[i].Name, out SpFieldInfo spRecodsetFiled) ? spRecodsetFiled : null });
public async Task <CommandResult> Execute(SpInfo procInfo, DirectSpContext context, IDictionary <string, object> callParams, bool isReadScale) { var res = new CommandResult(); //set context param if exists var contextSpParam = procInfo.Params.FirstOrDefault(x => x.ParamName.Equals("context", StringComparison.InvariantCultureIgnoreCase)); if (contextSpParam != null) { callParams.Add(contextSpParam.ParamName, JsonConvert.SerializeObject(context)); } using (var sqlConnection = new SqlConnection(isReadScale ? ConnectionStringReadOnly : ConnectionStringReadWrite)) using (var sqlCommand = new SqlCommand($"{procInfo.SchemaName}.{procInfo.ProcedureName}", sqlConnection)) { // create SqlParameters foreach (var callParam in callParams) { var spParam = procInfo.Params.First(x => x.ParamName.Equals(callParam.Key, StringComparison.OrdinalIgnoreCase)); var sqlParam = new SqlParameter($"@{spParam.ParamName}", Enum.Parse <SqlDbType>(spParam.SystemTypeName, true), spParam.Length) { Direction = spParam.IsOutput ? ParameterDirection.InputOutput : ParameterDirection.Input }; if (callParam.Value != Undefined.Value) { sqlParam.Value = callParam.Value; } if (callParam.Value == Undefined.Value) { sqlParam.Direction = ParameterDirection.Output; } if (callParam.Key == "returnValue") { sqlParam.Direction = ParameterDirection.ReturnValue; } sqlCommand.Parameters.Add(sqlParam); } sqlCommand.CommandType = CommandType.StoredProcedure; if (procInfo.ExtendedProps.CommandTimeout != -1) { sqlCommand.CommandTimeout = procInfo.ExtendedProps.CommandTimeout; } //execute reader sqlConnection.Open(); try { using var dataReader = await sqlCommand.ExecuteReaderAsync(); res.Table = GetResultTable(dataReader); dataReader.Close(); } catch (Exception ex) { HandleException(ex); throw; } //return out parameter res.AgentContext = context.AgentContext; for (var i = 0; i < sqlCommand.Parameters.Count; i++) { var sqlParameter = sqlCommand.Parameters[i]; if (sqlParameter.Direction == ParameterDirection.InputOutput || sqlParameter.Direction == ParameterDirection.Output || sqlParameter.Direction == ParameterDirection.ReturnValue) { //process context param if (sqlParameter.ParameterName.Equals("@context", StringComparison.OrdinalIgnoreCase)) { if (sqlParameter.Value != DBNull.Value) { var newContext = JsonConvert.DeserializeObject <DirectSpContext>((string)sqlParameter.Value); res.AgentContext = newContext.AgentContext; } } //process non context param else { res.OutParams.Add(sqlParameter.ParameterName.Substring(1), sqlParameter.Value != DBNull.Value ? sqlParameter.Value : null); } } } } return(res); }
public async Task <CommandResult> Execute(SpInfo procInfo, DirectSpContext context, IDictionary <string, object> callParams, bool isReadScale) { var schema = procInfo.SchemaName; var procName = procInfo.ProcedureName; if (schema != _targetType.Name) { throw new Exception($"Invalid schema {schema}!"); } var methodInfo = _targetType.GetMethod(procName); if (methodInfo == null) { throw new Exception($"{procName} was not found!"); } //call method by name parameters var parameterInfos = methodInfo.GetParameters(); var parameterValues = new object[parameterInfos.Length]; for (var i = 0; i < parameterInfos.Length; i++) { var parameterInfo = parameterInfos[i]; if (callParams.TryGetValue(parameterInfo.Name, out object value) && value != Undefined.Value) { var parameterType = parameterInfo.ParameterType.IsByRef ? parameterInfo.ParameterType.GetElementType() : parameterInfo.ParameterType; parameterType = Nullable.GetUnderlyingType(parameterType) ?? parameterType; parameterValues[i] = value == null ? null : Convert.ChangeType(value, parameterType); } else if (parameterInfo.HasDefaultValue) { parameterValues[i] = parameterInfo.DefaultValue; } } //throw error if there is additional params in given parameters foreach (var callParam in callParams) { if (callParam.Key != "returnValue" && parameterInfos.FirstOrDefault(x => x.Name == callParam.Key) == null) { throw new Exception($"Unknown parameter! ParameterName: {callParam.Key}"); } } var ret = new CommandResult(); try { //Set Thread Context Thread.SetData(Thread.GetNamedDataSlot("DirectSpContext"), context); //invoke command and set return value if (methodInfo.ReturnType == typeof(void)) { methodInfo.Invoke(_targetObject, parameterValues); } else { var invokeRes = methodInfo.Invoke(_targetObject, parameterValues); //manage result for Task (void) if (invokeRes is Task && !invokeRes.GetType().IsGenericType) { await(Task) invokeRes; } //manage result for Task (generic) else if (invokeRes is Task) { await((Task)invokeRes).ConfigureAwait(false); ret.OutParams["returnValue"] = ((Task)invokeRes).GetType().GetProperty("Result").GetValue(invokeRes); } else { ret.OutParams["returnValue"] = invokeRes; } } //set agent context ret.AgentContext = context.AgentContext; //set output paramters for (var i = 0; i < parameterInfos.Length; i++) { var parameterInfo = parameterInfos[i]; if (parameterInfo.IsOut || parameterInfo.ParameterType.IsByRef) { if (callParams.ContainsKey(parameterInfo.Name)) { ret.OutParams[parameterInfo.Name] = parameterValues[i]; } } } return(ret); } catch (TargetInvocationException ex) { throw ex.InnerException; } finally { Thread.SetData(Thread.GetNamedDataSlot("DirectSpContext"), null); } }