protected void SetMassiveOperationParameters <T>(IEnumerable <T> obj, TransactionTypes transactionType, QueryOptions queryOptions) where T : Cope <T>, IManageable, new() { Logger.Info(string.Format("Setting parameters in command based massive operation transaction type {1}.", typeof(T), transactionType.ToString())); MassiveOperationParameter parameters = DataSerializer.GenerateCompatibleMassiveOperationXML(obj, transactionType); _command.Parameters.Add(CreateDbParameter("_xmlValues", parameters.XmlValues)); _command.Parameters.Add(CreateDbParameter("_xmlNames", parameters.XmlNames)); _command.Parameters.Add(CreateDbParameter("_procedureName", parameters.ProcedureName)); }
internal static MassiveOperationParameter GenerateCompatibleMassiveOperationXML <T>(IEnumerable <T> list, TransactionTypes transactionType) where T : Cope <T>, IManageable, new() { MassiveOperationParameter massiveOperationParameter = new MassiveOperationParameter(); StringBuilder builder = new StringBuilder(); builder.Append("<columns>\n"); if (transactionType == TransactionTypes.DeleteMassive) { builder.Append(" <column>\n"); builder.Append($" <name>{Cope<T>.ModelComposition.PrimaryKeyProperty.Name}</name>\n"); builder.Append(" </column>\n"); } else { foreach (KeyValuePair <string, PropertyInfo> property in Cope <T> .ModelComposition.FilteredProperties) { builder.Append(" <column>\n"); builder.Append($" <name>{property.Value.Name}</name>\n"); builder.Append(" </column>\n"); } } builder.Append("</columns>"); massiveOperationParameter.XmlNames = builder.ToString(); builder.Clear(); builder.Append("<objects>\n"); if (transactionType == TransactionTypes.DeleteMassive) { foreach (T obj in list) { builder.Append(" <object>\n"); // Si es Numero o Boolean no agrega comillas sencillas, de lo contrario se las pone. if (long.TryParse(Cope <T> .ModelComposition.PrimaryKeyProperty.GetValue(obj).ToString(), out long n) || Cope <T> .ModelComposition.PrimaryKeyProperty.GetValue(obj) is bool) { builder.Append($" <{Cope<T>.ModelComposition.PrimaryKeyProperty.Name}>{Cope<T>.ModelComposition.PrimaryKeyProperty.GetValue(obj)}</{Cope<T>.ModelComposition.PrimaryKeyProperty.Name}>\n"); } else { builder.Append($" <{Cope<T>.ModelComposition.PrimaryKeyProperty.Name}>'{Cope<T>.ModelComposition.PrimaryKeyProperty.GetValue(obj)}'</{Cope<T>.ModelComposition.PrimaryKeyProperty.Name}>\n"); } builder.Append(" </object>\n"); } } else { foreach (T obj in list) { builder.Append(" <object>\n"); foreach (KeyValuePair <string, PropertyInfo> property in Cope <T> .ModelComposition.FilteredProperties) { if (property.Value.GetValue(obj) == null) { builder.Append($" <{property.Value.Name}>{DBNull.Value}</{property.Value.Name}>\n"); } else { // Si es Numero o Boolean no agrega comillas sencillas, de lo contrario se las pone. if (long.TryParse(property.Value.GetValue(obj).ToString(), out long n) || property.Value.GetValue(obj) is bool) { builder.Append($" <{property.Value.Name}>{property.Value.GetValue(obj)}</{property.Value.Name}>\n"); } else { if (property.Value.GetValue(obj) is DateTime) { builder.Append($" <{property.Value.Name}>'{((DateTime)property.Value.GetValue(obj)).ToString("yyyy-MM-dd H:mm:ss")}'</{property.Value.Name}>\n"); } else { builder.Append($" <{property.Value.Name}>'{property.Value.GetValue(obj)}'</{property.Value.Name}>\n"); } } } } builder.Append(" </object>\n"); } } builder.Append("</objects>"); massiveOperationParameter.XmlValues = builder.ToString(); switch (transactionType) { case TransactionTypes.InsertMassive: massiveOperationParameter.ProcedureName = Manager.ConnectionType == ConnectionTypes.MySQL ? $"`{Manager.StoredProcedurePrefix}{Cope<T>.ModelComposition.TableName}{Manager.InsertSuffix}`" : $"[{Manager.StoredProcedurePrefix}{Cope<T>.ModelComposition.TableName}{Manager.InsertSuffix}]"; break; case TransactionTypes.UpdateMassive: massiveOperationParameter.ProcedureName = Manager.ConnectionType == ConnectionTypes.MySQL ? $"`{Manager.StoredProcedurePrefix}{Cope<T>.ModelComposition.TableName}{Manager.UpdateSuffix}`" : $"[{Manager.StoredProcedurePrefix}{Cope<T>.ModelComposition.TableName}{Manager.UpdateSuffix}]"; break; case TransactionTypes.DeleteMassive: massiveOperationParameter.ProcedureName = Manager.ConnectionType == ConnectionTypes.MySQL ? $"`{Manager.StoredProcedurePrefix}{Cope<T>.ModelComposition.TableName}{Manager.DeleteSuffix}`" : $"[{Manager.StoredProcedurePrefix}{Cope<T>.ModelComposition.TableName}{Manager.DeleteSuffix}]"; break; default: throw new NotSupportedException($"El tipo de transaccion {transactionType.ToString()} no puede ser utilizado con la funcion {nameof(GenerateCompatibleMassiveOperationXML)}."); } return(massiveOperationParameter); }