Ejemplo n.º 1
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 nm_insumo 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);
        }
Ejemplo n.º 2
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 nm_insumo 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 nm_insumo 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);
        }