Esempio n. 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;
        }
Esempio n. 2
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();
                }
        }
Esempio n. 3
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());
        }
Esempio n. 4
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;
        }
Esempio n. 5
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();
        }
Esempio n. 6
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;
        }