/// <summary> /// Evaluates the StoredProcedure and returns the complete TriState result of it /// </summary> /// <param name="procedureName">the storedprocedure to call</param> /// <param name="entity">the entity for which to evaluate this constraint</param> /// <returns>the complete value of the stored procedure</returns> private SimpleTriStateResult AutoProcExT(string procedureName, T entity) { ParameterDescriptor[] parameters = DescribeProcedure(procedureName, entity, true); SimpleTriStateResult retVal = RunProcedureT(procedureName, parameters); return(retVal); }
/// <summary> /// Evaluates the provided storedprocedure and returns its result as TriState DecisionResult /// </summary> /// <param name="procedureName">the name of the stored procedure</param> /// <param name="entity">the entity for which to evaluate the parameters</param> /// <returns>a value indicating whether the stored procedure evaluated the given entity properly</returns> private DecisionResult AutoProcT(string procedureName, T entity) { SimpleTriStateResult retVal = AutoProcExT(procedureName, entity); LastMessage = retVal.Message; return(retVal.Result); }
/// <summary> /// Runs a Procedure with the given name and parameters and returns a SimpleTriStateResult /// </summary> /// <param name="procedureName">the procedurename without schema</param> /// <param name="parameters">the parameters to pass to the procedure</param> /// <returns>a value containing the simple result of the procedure</returns> private SimpleTriStateResult RunProcedureT(string procedureName, ParameterDescriptor[] parameters) { SqlParameter[] args = (from t in parameters where !t.IsOptional || t.ParameterValue != null select new SqlParameter { ParameterName = t.ParameterName, Direction = !t.IsRef ? ParameterDirection.Input : ParameterDirection.InputOutput, Value = t.ParameterValue ?? DBNull.Value }).ToArray(); using (database.Database.UseConnection(out DbCommand cmd)) { cmd.CommandText = $"[{Schema}].[{procedureName}]"; cmd.Parameters.AddRange(args); cmd.CommandType = CommandType.StoredProcedure; SimpleTriStateResult retVal = new SimpleTriStateResult { Result = DecisionResult.None }; bool doClose = false; using (var reader = cmd.ExecuteReader()) { bool first = true; bool messageRead = false; while (reader.Read()) { if (first) { retVal.Result = (DecisionResult)reader.GetInt32(0); if (reader.FieldCount >= 2) { if (!reader.IsDBNull(1)) { retVal.Message = reader.GetString(1); } messageRead = true; } first = false; } } (from t in parameters join a in args on t.ParameterName equals a.ParameterName where t.IsRef select new { Param = t, Arg = a }).ForEach(n => n.Param.ParameterValue = n.Arg.Value); if (!messageRead) { ParameterDescriptor desc = parameters.FirstOrDefault( n => n.IsRef && n.ParameterName.Equals("@message", StringComparison.OrdinalIgnoreCase)); if (desc != null) { retVal.Message = desc.ParameterValue as string; } } } return(retVal); } }