psantos10 Posted February 18, 2013 at 03:37 PM Report #495974 Posted February 18, 2013 at 03:37 PM Prezados, Tenho uma dúvida: Estou a criar uma aplicação em C#, e nela tenho uma classe: UtilizadorDAL onde tenho uma função que cria novo usuário na base de dados: public int Add(Utilizador utilizador) { try { string cmdText = "INSERT INTO utilizadores" + " (nome, data_nascimento, estado_civil, sexo, num_bilhete_identidade, nome_pai, nome_mae, endereco, bairro, municipio, nacionalidade, celular, telefone, email, data_baptismo, local_baptismo, data_comunhao, local_comunhao, data_crisma, local_crisma, data_criacao, data_actualizacao, estado)" + " VALUES " + "(@nome, @data_nascimento, @estado_civil, @sexo, @num_bilhete_identidade, @nome_pai, @nome_mae, @endereco, @bairro, @municipio, @nacionalidade, @celular, @telefone, @email, @data_baptismo, @local_baptismo, @data_comunhao, @local_comunhao, @data_crisma, @local_crisma, @data_criacao, @data_actualizacao, @estado)"; this.OpenConnection(); this.MyCommand = new MySqlCommand(cmdText, this.MyConnection); MyCommand.Parameters.Add("@nome", MySqlDbType.VarChar).Value = catequista.Nome; MyCommand.Parameters.Add("@data_nascimento", MySqlDbType.Date).Value = catequista.DataNascimento; MyCommand.Parameters.Add("@estado_civil", MySqlDbType.Enum).Value = catequista.EstadoCivil; MyCommand.Parameters.Add("@sexo", MySqlDbType.Enum).Value = catequista.Sexo; MyCommand.Parameters.Add("@num_bilhete_identidade", MySqlDbType.VarChar).Value = catequista.NumBilheteIdentidade; // ... MyCommand.Parameters.Add("@data_criacao", MySqlDbType.DateTime).Value = DateTime.Now; MyCommand.Parameters.Add("@data_actualizacao", MySqlDbType.DateTime).Value = DateTime.Now; MyCommand.Parameters.Add("@estado", MySqlDbType.VarChar, 1).Value = "A"; this.MyCommand.ExecuteNonQuery(); return Convert.ToInt32(MyCommand.LastInsertedId); } catch (Exception ex) { throw ex; } finally { this.CloseConnection(); } } Como podem notar, este método recebe como parametro um objecto do tipo Utilizador. E se eu quiser gravar um outro objecto, terei que criar a mesma função (método) para o novo objecto (nova classe). A minha questão é, como faço para ter apenas um metódo "Gravar" que recebe qualquer objecto e com base no objecto criaod seja capaz de gravar na tabela correcta como acontece com o método "Create()" do Framework CakePHP ou Ruby on Rails? Grato pela atenção... -------Assinatura?
Rechousa Posted February 19, 2013 at 01:01 AM Report #496094 Posted February 19, 2013 at 01:01 AM (edited) Olá, Podes tentar fazer o seguinte: Crias uma classe base (vamos charmar-lhe BaseDAL) e lá colocas o método Save que recebe a query de inserção e uma lista de parâmetros, exemplo: (não testei o código...): // TODO: o método tem mesmo de ser público??? public int Save(string Query, Parameters parameters) { // TODO: fazer surround com o statement using() this.OpenConnection(); this.MyCommand = new MySqlCommand(Query, this.MyConnection); MyCommand.Parameters.AddRange(parameters); this.MyCommand.ExecuteNonQuery(); return Convert.ToInt32(MyCommand.LastInsertedId); } Depois, para cada classe, herdas da class nova (BaseDAL) e invocas o método Save, exemplo para Utilizador: public int Add(Utilizador utilizador) { try { string cmdText = "INSERT INTO utilizadores" + " (nome, data_nascimento, estado_civil, sexo, num_bilhete_identidade, nome_pai, nome_mae, endereco, bairro, municipio, nacionalidade, celular, telefone, email, data_baptismo, local_baptismo, data_comunhao, local_comunhao, data_crisma, local_crisma, data_criacao, data_actualizacao, estado)" + " VALUES " + "(@nome, @data_nascimento, @estado_civil, @sexo, @num_bilhete_identidade, @nome_pai, @nome_mae, @endereco, @bairro, @municipio, @nacionalidade, @celular, @telefone, @email, @data_baptismo, @local_baptismo, @data_comunhao, @local_comunhao, @data_crisma, @local_crisma, @data_criacao, @data_actualizacao, @estado)"; // Hum... de onde é que vem o objecto catequista? Em cima está utilizador.... TODO: Rever isto List<Parameters> parameters = new List<Parameters>; parameters.Add(new Parameter("@nome", MySqlDbType.VarChar).Value = catequista.Nome); parameters.Add(new Parameter("@data_nascimento", MySqlDbType.Date).Value = catequista.DataNascimento); parameters.Add(new Parameter("@estado_civil", MySqlDbType.Enum).Value = catequista.EstadoCivil); parameters.Add(new Parameter("@sexo", MySqlDbType.Enum).Value = catequista.Sexo); parameters.Add(new Parameter("@num_bilhete_identidade", MySqlDbType.VarChar).Value = catequista.NumBilheteIdentidade); // ... parameters.Add(new Parameter("@data_criacao", MySqlDbType.DateTime).Value = DateTime.Now); parameters.Add(new Parameter("@data_actualizacao", MySqlDbType.DateTime).Value = DateTime.Now); parameters.Add(new Parameter("@estado", MySqlDbType.VarChar, 1).Value = "A"); return this.Save(cmdText, parameters); } catch (Exception ex) { // Apanhas a excepção só para fazer throw? Então para isso é preferível nem a apanhar. throw ex; } } Exemplo para Sacerdotes (vi catequista, lembrei-me de Sacerdotes): public int Add(Sacerdote sacerdote) { try { string cmdText = "INSERT INTO sacerdote" + " (nome, data_nascimento, sexo, num_bilhete_identidade, nome_pai, nome_mae, endereco, bairro, municipio, nacionalidade, celular, telefone, email, data_baptismo, local_baptismo, data_comunhao, local_comunhao, data_crisma, local_crisma, data_criacao, data_actualizacao, estado)" + " VALUES " + "(@nome, @data_nascimento, @sexo, @num_bilhete_identidade, @nome_pai, @nome_mae, @endereco, @bairro, @municipio, @nacionalidade, @celular, @telefone, @email, @data_baptismo, @local_baptismo, @data_comunhao, @local_comunhao, @data_crisma, @local_crisma, @data_criacao, @data_actualizacao, @estado)"; List<Parameters> parameters = new List<Parameters>; parameters.Add(new Parameter("@nome", MySqlDbType.VarChar).Value = sacerdote.Nome); parameters.Add(new Parameter("@data_nascimento", MySqlDbType.Date).Value = sacerdote.DataNascimento); // parameters.Add(new Parameter("@estado_civil", MySqlDbType.Enum).Value = sacerdote.EstadoCivil); parameters.Add(new Parameter("@sexo", MySqlDbType.Enum).Value = sacerdote.Sexo); parameters.Add(new Parameter("@num_bilhete_identidade", MySqlDbType.VarChar).Value = sacerdote.NumBilheteIdentidade); // ... parameters.Add(new Parameter("@data_criacao", MySqlDbType.DateTime).Value = DateTime.Now); parameters.Add(new Parameter("@data_actualizacao", MySqlDbType.DateTime).Value = DateTime.Now); parameters.Add(new Parameter("@estado", MySqlDbType.VarChar, 1).Value = "A"); return this.Save(cmdText, parameters); } catch (Exception ex) { // Podes meter um LOG aqui throw ex; } } Espero ter ajudado. Edited February 19, 2013 at 01:03 AM by Rechousa Pedro Martins Sharing is Knowledge! http://www.linkedin.com/in/rechousa
psantos10 Posted February 19, 2013 at 10:34 AM Author Report #496107 Posted February 19, 2013 at 10:34 AM Olá Prezado Rechousa, Muito obrigado pela resposta e ajudou-me em alguns pontos mas infelizmente a minhá dúvida prevalece. Note que o que pretendo evitar, é que para todo objecto que precisa ser persistido na base de dados eu tenha que criar um novo método Add(). A ideia é ter algo generico... e sempre que eu criar uma classe tipo: class Catequista : BaseDAL { private int id; private string nome; // ... } eu seja capaz de chamar o método Save() da classe BaseDAL sem ter que sobrescrever para cada nova classe criada. Pois no exemplo que me passou, terei sempre que criar o metodo Add() e nele sempre adicionar o cmdText que as vezes têm sido muito longo e trabalhoso. grato pela atenção mais uma vez -------Assinatura?
psantos10 Posted February 20, 2013 at 09:18 AM Author Report #496264 Posted February 20, 2013 at 09:18 AM E aí pessoal... alguém dá uma ajuda? -------Assinatura?
kalin Posted February 26, 2013 at 04:11 PM Report #497082 Posted February 26, 2013 at 04:11 PM Os comamdos sql terão de ser sempre criados, para cada classe. A classe que crias em c# e a tabela na bd são coisas diferentes e não tem conhecimento entre si. Já pensaste usar um ORM como Entity Framework? Esta é a única ferramenta que te pode dar o que queres, geração de código c# e a ligação as tabelas da bd com a geração automática das queries sql (CRUD).
pikax Posted February 26, 2013 at 04:16 PM Report #497084 Posted February 26, 2013 at 04:16 PM podes criar uma interface, e quando estas a criar o objecto usar uma factory Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender. A beleza de um código está em decompor problemas complexos em pequenos blocos simples. "learn how to do it manually first, then use the wizzy tool to save time." "Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now