public List <DTO.DbObjectDefinition> GetObject(ObjectType objectType = ObjectType.All, string objectName = "", string schemaName = "")
        {
            List <DbParameter>            parameters = new List <DbParameter>();
            List <string>                 objectTypes;
            List <DTO.DbObjectDefinition> dbObjectDefinitions = new List <DTO.DbObjectDefinition>();

            try
            {
                objectTypes = objectType.GetValue();
                foreach (string item in objectTypes)
                {
                    #region Parameters
                    //Parameters need to be recreated every time otherwise,
                    //an exception ("The SqlParameter is already contained by another SqlParameterCollection.") will be thrown.
                    parameters.Clear();
                    parameters.Add(GetParameter("@ObjectName", string.IsNullOrEmpty(objectName) ? null : objectName));
                    parameters.Add(GetParameter("@SchemaName", string.IsNullOrEmpty(schemaName) ? null : schemaName));

                    if (objectType != ObjectType.All)
                    {
                        parameters.Add(GetParameter("@ObjectType", item));
                    }
                    else
                    {
                        parameters.Add(GetParameter("@ObjectType", null));
                    }

                    #endregion
                    using (DbDataReader dr = ExecuteDataReader(_generalInfo.GetObjectDefinition, parameters, CommandType.Text))
                    {
                        DTO.DbObjectDefinition dbObjectDefinition;
                        while (dr.Read())
                        {
                            dbObjectDefinition = new DTO.DbObjectDefinition(dr);

                            if (ObjectType.Views.GetValue().Contains(dbObjectDefinition.Type))
                            {
                                dbObjectDefinition.Definition += GetIndexFromView(dbObjectDefinition.Name);
                            }

                            dbObjectDefinitions.Add(dbObjectDefinition);
                        }
                    }

                    if (objectType == ObjectType.All)
                    {
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                LogManager.ReconfigExistingLoggers();
                _logger.Error(ex);
                throw;
            }

            return(dbObjectDefinitions);
        }
        private List <string> Update(ObjectType objectType, string fileName, DTO.DbObjectDefinition dbObjectDefinition)
        {
            List <string> objectUpdated          = new List <string>();
            List <string> objectDefinitionLocal  = System.IO.File.ReadLines(fileName, Util.GetEncoding(fileName)).ToList();
            string        objectTypeLocal        = GetObjectTypeFromDefinition(string.Join(Environment.NewLine, objectDefinitionLocal));
            List <string> objectDefinitionRemote = dbObjectDefinition != null?dbObjectDefinition.Definition.Split(new string[] { Environment.NewLine }, StringSplitOptions.None).ToList() : new List <string>();

            string objectName = fileName.Split('\\').Last();

            try
            {
                //Check if object type should be updated
                var objectTypeList = objectType.GetValue();
                if (objectType.Equals(ObjectType.All) || objectTypeList.Contains(objectTypeLocal))
                {
                    //Clean up objects before compare
                    objectDefinitionLocal  = CleanObjectDefinition(objectDefinitionLocal);
                    objectDefinitionRemote = CleanObjectDefinition(objectDefinitionRemote);

                    //Update when necessary
                    if (dbObjectDefinition == null || !AreObjectsEquals(objectName, objectDefinitionLocal, objectDefinitionRemote, objectTypeLocal))
                    {
                        CompareNameToDefinitionName(System.IO.Path.GetFileNameWithoutExtension(fileName), objectDefinitionLocal);
                        string[] queries = string.Join(Environment.NewLine, objectDefinitionLocal).Split(new string[] { CREATE_INDEX }, StringSplitOptions.None);
                        KeyValuePair <string, string> keyValuePair = GetReplaceString(objectTypeLocal);

                        for (int i = 0; i < queries.Length; i++)
                        {
                            //Remove Encryptation if exists
                            queries[i] = Regex.Replace(queries[i], "WITH ENCRYPTION*([^\\s]+)", string.Empty, RegexOptions.IgnoreCase);

                            Console.WriteLine(string.Format("Updating object {0} query {1} of {2}.", objectName, i + 1, queries.Length));
                            Console.WriteLine("");
                            if (ExecuteNonQuery(dbObjectDefinition != null ? Regex.Replace(queries[i], keyValuePair.Key, keyValuePair.Value, RegexOptions.IgnoreCase) : queries[i], commandType: CommandType.Text) != 0)
                            {
                                if (i == queries.Length - 1) //Wait until execute the last instruction
                                {
                                    objectUpdated.Add(objectName);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.Error(ex, $"Filename: {fileName }");
                throw;
            }

            return(objectUpdated);
        }