Example #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 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 #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 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;
        }