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