// 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; }
/// <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; }
/// <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(); } }
// 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()); }
/// <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; }
/// <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; }
/// <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); }
/// <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); }
// 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(); }
/// <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; }