Example #1
0
        // grava um único objeto

        /// <summary>
        /// Persiste (grava) um objeto em banco mySQL baseando-se nos atributos do objeto para saber os campos e seus tipos
        /// Pessoa p = new Pessoa () { Nome = "Junior" };
        /// DAL.Gravar(p);
        /// </summary>
        /// <param name="data">instância do objeto a ser gravado.</param>
        /// <returns>Retornar o id do objeto (em caso de inserção)</returns>
        public static long Gravar(object data)
        {
            long idRetorno = 0;

            // o Montador.GetCampos retorna num List<Campo> o nome do campo, se é PK e seu valor (Nullable<object>)
            List<Campo> campos = Montador.GetCampos(data);
            string tableName = Montador.GetTableName(data);


            using (MySqlConnection conexao = new MySqlConnection(GetStringConexao()))
            {
                conexao.Open();

                using (Comando comando = new Comando(conexao, GetSqlInsertUpdate(tableName, campos)))
                {
                    foreach (Campo campo in campos)
                    {
                        comando.AddParam(string.Format("@{0}", campo.Nome), (campo.Valor ?? DBNull.Value));
                    }
                    try
                    {
                        comando.Execute();
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    idRetorno = comando.LastInsertId;
                }
            }
            return idRetorno;
        }
Example #2
0
        /// <summary>
        /// Efetua um select na base e retorna um objeto T com base no seu primary key
        /// <c>Empresa empresa = DAL.GetObjetoById<Empresa>(3);</c>
        /// </summary>
        /// <typeparam name="T">Tipo do retorno</typeparam>
        /// <param name="id">Código id para buscar o objeto na base</param>
        /// <returns>Retorna uma instância do Tipo</returns>
        public static T GetObjetoById<T>(long id) where T : class, new()
        {
            // cria uma instância do objeto
            T item = new T();

            // pega os campos para poder montar o select
            List<Campo> campos = Montador.GetCampos(item);

            // monta o select e filtra pelo campo chave
            string sql = GetSqlSelect(item, string.Format("{0}={1}", GetIdFieldName(campos), id));

            using (MySqlConnection conexao = new MySqlConnection(GetStringConexao()))
            using (Comando comando = new Comando(conexao, sql))
            using (Leitor leitor = comando.Select())
            {
                // tem retorno
                if (leitor.RecordCount > 0)
                    // percorre as propriedades
                    foreach (PropertyInfo property in Auxiliar.PropertySimple(item))
                    {
                        // valor busta pelo nome do campo
                        object valor = leitor.GetObject(Auxiliar.GetColumnName(property));

                        if ((valor != null) && (!(valor is System.DBNull)))
                        {
                            property.SetValue(item,
                                                valor.GetType().Name.Equals("TimeSpan") ? valor.ToString() : valor.GetType().Name.Equals("SByte") ? (((sbyte)valor == 1) ? true : false) : valor, null);
                        }
                    }
            }

            return item;
        }
Example #3
0
        /// <summary>
        /// Exclui um objeto em banco mySQL baseando-se nos atributos do objeto para saber os campos e seus tipos
        /// Pessoa p = new Pessoa () { Id = 1 };
        /// DAL.Excluir(p);
        /// </summary>
        /// <param name="data">instância do objeto a ser eliminado.</param>
        public static void Excluir(object data)
        {
            // o Montador.GetCampos retorna num List<Campo> o nome do campo, se é PK e seu valor (Nullable<object>)
            List <Campo> campos    = Montador.GetCampos(data);
            string       tableName = Montador.GetTableName(data);

            string sqlId = string.Empty;

            foreach (Campo campo in campos)
            {
                if (campo.IsKey)
                {
                    sqlId = string.Format("{0}=@{0}", campo.Nome);
                    break;
                }
            }

            if (sqlId == string.Empty)
            {
                // algo errado
                Exception e = new Exception("Id não localizado para exclusão");
                throw e;
            }

            // vamos pegar o valor id
            long id = DAL.GetIdValue(campos);

            StringBuilder sql = new StringBuilder();

            sql.Append("delete from ");
            sql.Append(tableName);
            sql.Append(" where ");
            sql.Append(sqlId);

            using (MySqlConnection conexao = new MySqlConnection(GetStringConexao()))
                using (Comando comando = new Comando(conexao, sql.ToString()))
                {
                    conexao.Open();

                    foreach (Campo campo in campos)
                    {
                        if (campo.IsKey)
                        {
                            comando.AddParam(string.Format("@{0}", campo.Nome), campo.Valor);
                            break;
                        }
                    }

                    comando.Execute();
                }
        }
Example #4
0
        // retorna um "select campo1, campo2, campo3 from tabela" a partir do objeto passar por parametro
        protected static string GetSqlSelect(object data, string filtro = "", string ordem = "", string group = "", int limite = 0)
        {
            // o Montador.GetCampos retorna num List<Campo> o nm_insumo do campo
            List <Campo> campos = Montador.GetCampos(data);

            StringBuilder sqlCampos = new StringBuilder();

            foreach (Campo campo in campos)
            {
                sqlCampos.Append(string.Format("{0},", campo.Nome));
            }
            sqlCampos.Remove(sqlCampos.Length - 1, 1);

            StringBuilder sql = new StringBuilder();

            sql.Append("select ");
            sql.Append(sqlCampos.ToString());
            sql.Append(" from ");
            sql.Append(Montador.GetTableName(data));

            // temos where?
            if (!filtro.Trim().Equals(string.Empty))
            {
                sql.Append(" where ");
                sql.Append(filtro);
            }

            // temos order by?
            if (!ordem.Trim().Equals(string.Empty))
            {
                sql.Append(" order by ");
                sql.Append(ordem);
            }

            // temos order by?
            if (!group.Trim().Equals(string.Empty))
            {
                sql.Append(" group by ");
                sql.Append(group);
            }

            // temos um limite definido de registros?
            if (limite > 0)
            {
                sql.Append(" limit ");
                sql.Append(limite);
            }

            return(sql.ToString());
        }
Example #5
0
        /// <summary>
        /// Grava (persiste) no banco mySQL vários objetos da List (todos dentro da mesma transação)
        /// </summary>
        /// <typeparam name="T">Tipo do objeto a ser gravado</typeparam>
        /// <param name="list">Lista de T</param>
        /// <returns>Quantidade de objetos gravados</returns>
        public static int GravarList<T>(List<T> list)
        {
            if (list.Count == 0)
                return 0;

            int idRetorno = 0;

            // o Montador.GetCampos retorna num List<Campo> o nome do campo, se é PK e seu valor (Nullable<object>)
            List<Campo> campos = Montador.GetCampos(list[0]);
            string tableName = Montador.GetTableName(list[0]);

            using (MySqlConnection conexao = new MySqlConnection(GetStringConexao()))
            {
                conexao.Open();
                using (Transacao transacao = new Transacao(conexao))
                using (Comando comando = new Comando(transacao, GetSqlInsertUpdate(tableName, campos)))
                {
                    try
                    {
                        // percorre os objetos da lista
                        foreach (Object obj in list)
                        {
                            // atualiza os valores
                            campos = Montador.GetCampos(obj);
                            foreach (Campo campo in campos)
                            {
                                comando.AddParam(string.Format("@{0}", campo.Nome), (campo.Valor ?? DBNull.Value));
                            }
                            comando.Execute();
                            // limpa os parâmetros e vamos para o próximo
                            comando.ClearParam();
                            idRetorno++;
                        }
                        transacao.Commit();
                    }
                    catch (Exception ex)
                    {
                        transacao.RollBack();
                        throw ex;
                    }
                }
            }
            return idRetorno;
        }
Example #6
0
        /// <summary>
        /// Efetua um select na base e retorna um objeto T com base em um filtro (retorna apenas 1 registro)
        /// </summary>
        /// <c>
        ///    Empregado empregado = new Empregado();
        ///
        ///    Filtros filtro = new Filtros().Add(() => empregado.Nome, empregado, FiltroExpressao.Igual, "Junior");
        ///    empregado = DAL.GetObjeto<Empregado>(filtro.ToString());
        ///
        ///    if (empregado == null)
        ///        Console.WriteLine("Nao encontrado!");
        ///    else
        ///        Console.WriteLine(empregado.Id + "-" + empregado.Nome);
        /// </c>
        /// <typeparam name="T">Tipo do retorno</typeparam>
        /// <param name="filtro">Use a classe Filtros para montar o filtro</param>
        /// <returns>Retorna uma instância do Tipo</returns>
        public static T GetObjeto<T>(string filtro = "") where T : class, new()
        {
            // cria uma instância do objeto
            T item = new T();

            // pega os campos para poder montar o select
            List<Campo> campos = Montador.GetCampos(item);

            // monta o select e filtra pelo campo chave
            string sql = GetSqlSelect(new T(), filtro);

            using (MySqlConnection conexao = new MySqlConnection(GetStringConexao()))
            using (Comando comando = new Comando(conexao, sql))
            using (Leitor leitor = comando.Select())
            {
                try
                {
                    // não tem nenhum? volta nulo
                    if (leitor.RecordCount == 0)
                        return null;

                    // percorre as propriedades
                    foreach (PropertyInfo property in Auxiliar.PropertySimple(item))
                    {
                        // valor busta pelo nome do campo
                        object valor = leitor.GetObject(Auxiliar.GetColumnName(property));
                        if ((valor != null) && (!(valor is System.DBNull)))
                        {
                            property.SetValue(item,
                                                valor.GetType().Name.Equals("TimeSpan") ? valor.ToString() : valor.GetType().Name.Equals("SByte") ? (((sbyte)valor == 1) ? true : false) : valor, null); ;
                        }
                    }
                }
                catch (Exception ex)
                {
                    // throw ex;
                }
            }

            return item;
        }
Example #7
0
        /// <summary>
        /// Efetua um select na base e retorna um objeto T com base no seu primary key
        /// <c>Empresa empresa = DAL.GetObjetoById<Empresa>(3);</c>
        /// </summary>
        /// <typeparam name="T">Tipo do retorno</typeparam>
        /// <param name="id">Código id para buscar o objeto na base</param>
        /// <returns>Retorna uma instância do Tipo</returns>
        public static T GetObjetoById <T>(int id) where T : class, new()
        {
            // cria uma instância do objeto
            T t = new T();

            // pega os campos para poder montar o select
            List <Campo> campos = Montador.GetCampos(t);

            // monta o select e filtra pelo campo chave
            string sql = GetSqlSelect(t, string.Format("{0}={1}", GetIdFieldName(campos), id));

            using (MySqlConnection conexao = new MySqlConnection(GetStringConexao()))
                using (Comando comando = new Comando(conexao, sql))
                    using (Leitor leitor = comando.Select())
                    {
                        // tem retorno
                        if (leitor.RecordCount > 0)
                        {
                            // percorre as propriedades
                            foreach (PropertyInfo property in Auxiliar.PropertySimple(t))
                            {
                                // valor busta pelo nm_insumo do campo
                                object valor = leitor.GetObject(Auxiliar.GetColumnName(property));

                                if ((valor != null) && (!(valor is System.DBNull)))
                                {
                                    try
                                    {
                                        property.SetValue(t, valor, null);
                                    }
                                    catch (Exception e)
                                    {
                                        Console.WriteLine(e.Message);
                                    }
                                }
                            }
                        }
                    }

            return(t);
        }
Example #8
0
        /// <summary>
        /// Efetua um select na base e retorna um objeto T com base em um filtro (retorna apenas 1 registro)
        /// </summary>
        /// <c>
        ///    Empregado empregado = new Empregado();
        ///
        ///    Filtros filtro = new Filtros().Add(() => empregado.Nome, empregado, FiltroExpressao.Igual, "Junior");
        ///    empregado = DAL.GetObjeto<Empregado>(filtro.ToString());
        ///
        ///    if (empregado == null)
        ///        Console.WriteLine("Nao encontrado!");
        ///    else
        ///        Console.WriteLine(empregado.Id + "-" + empregado.Nome);
        /// </c>
        /// <typeparam name="T">Tipo do retorno</typeparam>
        /// <param name="filtro">Use a classe Filtros para montar o filtro</param>
        /// <returns>Retorna uma instância do Tipo</returns>
        public static T GetObjeto <T>(string filtro = "") where T : class, new()
        {
            // cria uma instância do objeto
            T t = new T();

            // pega os campos para poder montar o select
            List <Campo> campos = Montador.GetCampos(t);

            // monta o select e filtra pelo campo chave
            string sql = GetSqlSelect(new T(), filtro);

            using (MySqlConnection conexao = new MySqlConnection(GetStringConexao()))
                using (Comando comando = new Comando(conexao, sql))
                    using (Leitor leitor = comando.Select())
                    {
                        // não tem nenhum? volta nulo
                        if (leitor.RecordCount == 0)
                        {
                            return(null);
                        }

                        // percorre as propriedades
                        foreach (PropertyInfo property in Auxiliar.PropertySimple(t))
                        {
                            // valor busta pelo nm_insumo do campo
                            object valor = leitor.GetObject(Auxiliar.GetColumnName(property));

                            if ((valor != null) && (!(valor is System.DBNull)))
                            {
                                property.SetValue(t, valor, null);
                            }
                        }
                    }

            return(t);
        }
Example #9
0
        // retorna um "select campo1, campo2, campo3 from tabela" a partir do objeto passar por parametro
        protected static string GetSqlSelectJoin(object dataPai, object dataFilho, string filtro = "", string ordem = "")
        {
            // o Montador.GetCampos retorna num List<Campo> o nome do campo
            List<Campo> camposPai = Montador.GetCampos(dataPai);
            string tabelaPai = Montador.GetTableName(dataPai);
            string campoKeyPai = string.Empty;

            List<Campo> camposFilho = Montador.GetCampos(dataFilho);
            string tabelaFilho = Montador.GetTableName(dataFilho);
            string campoFKFilho = string.Empty;

            #region monta os campos
            StringBuilder sqlCampos = new StringBuilder();
            foreach (Campo campo in camposPai)
            {
                if (campo.IsKey)
                {
                    sqlCampos.Append("a.");
                    campoKeyPai = "a." + campo.Nome;
                }
                sqlCampos.Append(string.Format("{0},", campo.Nome));
            }
            foreach (Campo campo in camposFilho)
            {
                if (campo.IsFK)
                    campoFKFilho = "b." + campo.Nome;
                else
                    sqlCampos.Append(string.Format("{0},", campo.Nome));
            }
            sqlCampos.Remove(sqlCampos.Length - 1, 1);
            #endregion

            StringBuilder sql = new StringBuilder();
            sql.Append("select ");
            sql.Append(sqlCampos.ToString());
            sql.Append(" from ");
            sql.Append(tabelaFilho);
            sql.Append(" as a join ");
            sql.Append(tabelaPai);
            sql.Append(" as b on ");
            sql.Append(campoKeyPai);
            sql.Append("=");
            sql.Append(campoFKFilho);

            // temos where?
            if (!filtro.Trim().Equals(string.Empty))
            {
                sql.Append(" where ");
                // caso tenha no where o campo key ou FK, trocamos pelo "lias.campo" para não dar erro de ambiguous field
                filtro = filtro.Replace(campoKeyPai.Split('.')[1], campoKeyPai);
                sql.Append(filtro);
            }

            // temos order by?
            if (!ordem.Trim().Equals(string.Empty))
            {
                sql.Append(" order by ");
                // caso tenha no order o campo key ou FK, trocamos pelo "lias.campo" para não dar erro de ambiguous field
                ordem = ordem.Replace(campoKeyPai.Split('.')[1], campoKeyPai);
                sql.Append(ordem);
            }
            return sql.ToString();
        }
Example #10
0
        /// <summary>
        /// Grava um objeto mestre e na mesma transação os filhos no list.
        /// <c>
        ///    List<Empresa> lista = new List<Empresa>();
        ///    lista.Add(new Empresa() { Nome = "empresa1" });
        ///    lista.Add(new Empresa() { Nome = "empresa2" });
        ///    lista.Add(new Empresa() { Nome = "empresa3" });
        ///    lista.Add(new Empresa() { Nome = "empresa4" });
        ///    lista.Add(new Empresa() { Nome = "empresa5" });
        ///
        ///    int registros_gravados = DAL.GravarList<Empresa>(lista);
        ///
        ///    Console.WriteLine("Total de registros gravados: " + registros_gravados.ToString());
        /// </c>
        /// </summary>
        /// <typeparam name="T">Tipo do objeto a ser gravado</typeparam>
        /// <param name="objMestre">Objeto pai</param>
        /// <param name="listDetalhes">Lista de T (filhos)</param>
        /// <returns>O id do registro pai</returns>
        public static long GravarMestreDetalhe<T>(object objMestre, List<T> listDetalhes)
        {
            long idRetorno = Montador.GetKeyId(objMestre);

            // o Montador.GetCampos retorna num List<Campo> o nome do campo, se é PK e seu valor (Nullable<object>)
            List<Campo> camposMestre = Montador.GetCampos(objMestre);
            string tableNameMestre = Montador.GetTableName(objMestre);

            using (MySqlConnection conexao = new MySqlConnection(GetStringConexao()))
            using (Transacao transacao = new Transacao(conexao))
            {
                try
                {
                    #region mestre
                    using (Comando comando = new Comando(transacao, GetSqlInsertUpdate(tableNameMestre, camposMestre)))
                    {
                        foreach (Campo campo in camposMestre)
                        {
                            comando.AddParam(string.Format("@{0}", campo.Nome), (campo.Valor ?? DBNull.Value));
                        }

                        comando.Execute();
                        // se é inserção então lemos o ultimo id
                        if (idRetorno == 0)
                            idRetorno = comando.LastInsertId;
                    }
                    #endregion

                    #region detalhes
                    if (listDetalhes.Count > 0)
                    {
                        // pegamos o nome do campo FK no primeiro objeto da lista
                        string campoDetalheFK = Montador.GetFieldFK(listDetalhes[0]);
                        // montamos a estrutura base do SQL 
                        string tableNameDetalhes = Montador.GetTableName(listDetalhes[0]);
                        List<Campo> camposDetalhes = Montador.GetCampos(listDetalhes[0]);

                        using (Comando comando = new Comando(transacao, GetSqlInsertUpdate(tableNameDetalhes, camposDetalhes)))
                        {
                            // percorre os objetos da lista
                            foreach (Object obj in listDetalhes)
                            {
                                // atualiza os valores
                                camposDetalhes = Montador.GetCampos(obj);
                                foreach (Campo campo in camposDetalhes)
                                {
                                    // o campo atual é FK?  e o valor é ZERO (null converte pra zero) ?
                                    if (campo.Nome.Equals(campoDetalheFK) && (int)(campo.Valor ?? 0) == 0)
                                        campo.Valor = idRetorno;

                                    comando.AddParam(string.Format("@{0}", campo.Nome), (campo.Valor ?? DBNull.Value));
                                }
                                comando.Execute();
                                // limpa os parâmetros e vamos para o próximo
                                comando.ClearParam();
                            }
                        }
                    }
                    #endregion
                    transacao.Commit();
                }
                catch (Exception ex)
                {
                    transacao.RollBack();
                    throw ex;
                }
            }
            return idRetorno;
        }