Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

psantos10

[dúvida] um método para várias classes

Mensagens Recomendadas

psantos10

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rechousa

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.

Editado por Rechousa

Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
psantos10

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
kalin

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).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

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."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.