Jump to content
psantos10

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

Recommended Posts

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?

Share this post


Link to post
Share on other 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.

Edited by Rechousa

Pedro Martins

Sharing is Knowledge!

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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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).

Share this post


Link to post
Share on other 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."

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.