Jump to content

Recommended Posts

Posted

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?

Posted (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 by Rechousa

Pedro Martins

Sharing is Knowledge!

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

Posted

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?

Posted

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

Posted

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.