FORM MASTER DETAIL

ANDREVB 16/02/2011 10:05:51
#365594
Eu tenho uma duvida, até meio boba eu acho, sou novato no C# , mas já procurei bastante e não encontrei nada que responda minha questão.

Suponhamos que eu tenha uma tela de venda, com dados da venda e os itens, como faço isso ? Digo, em relação a classe.

é uma classe só, fazendo tudo, gravando a venda, os itens e os dados do contas a receber, ou tem que ser uma classe pra cada item desses, uma pra venda, uma pra item e uma pra contas a receber.

E no caso de ser a segunda opção, como fica o controle de transação e a conexão, já que a cada comando executado ele abre, executa e fecha a conexão ?
GREGO 16/02/2011 10:40:36
#365596


fala!

eu faria um classe para cada cara mesmo, tipo um item é uma classe, um pedido é uma classe que em umas das propriedades é uma coleção de itens... e assim vai indo

quanto ao banco, em metodos que usam banco, voce pode colocar no contrutor um parametro para você passar a conexão com banco, ou no proprio metodo

tipo

public class item{
item(){
item(new cn = new sqlconnection([Ô]connectionstring[Ô]))
}
item(cn as sqlconnection){
}
}

algo assim, se eu instancia o objeto eu posso ou não passar o conexão

item obj item = new item(); ou

sqlconnection cn = new sqlconnection([Ô]connectionstring[Ô]);
item obj = new item(cn);

RXGOMES 16/02/2011 10:45:58
#365597
Olá ANDREVB, na minha opnião essa duvida não se aplica somente a C#, mas a POO.

Neste exemplo que você colocou, eu faria o seguinte:

No banco criaria 3 tabelas Vendas, ItemVenda e ContasReceber

Na aplicação teriamos 1 form para colocar as informações de venda e 3 classes Conexão, Vendas e Contas

Na classe conexão abre a conexão, neste caso com BeginTrans, e fecha a conexão, se deu tudo certo CommitTrans senão Roolback

Na classe Vendas dois métodos IncluirVendas e IncluirItemVenda

Na classe Contas um método IncluirContaReceber

No form no click do botão salvar, chamamos as funções na seguinte sequência

Abrir conexão (begintrans)
Incluir vendas (em caso de erro fecha a conexão)
Incluir Itens (em caso de erro fecha a conexão)
Incluir contas (em caso de erro fecha a conexão)
Fechar conexão (commit ou roolback)
ANDREVB 16/02/2011 11:03:03
#365599
RXGomes, caso então eu abriria a conexão atraves da classe conexão e não em cada método chamado, Incluir vendas, por exemplo.

No meu incluir vendas eu so aproveitaria a conexão aberta, e so fecharia em caso de erro, se tudo ocorrer bem a conexão permaneceria aberta, até que eu chamasse um metodo pra fechar a conexão da classe conexão.

é isso mesmo ?
GREGO 16/02/2011 16:58:37
#365678


assim funciona, mas as classe perdem a independencia

cada classe deve ter 2 contrutorores, um que~sem parametro, e outro com a conexão como parametro

quando a classe é instanciada sem uma conexão a propria classe se resolve e abre uma conexão

se for instancia informando uma conexão ela não precisa abrir e usa a informada, fazendo com que o sistema use apenas 1 conexão e todas as classe possão ser usadas independentes.
ANDREVB 18/02/2011 16:22:21
#365903
GREGO, blz, até aí entendi, o meu grande problema é na hora de fechar a conexão, como faria para diferenciar se a classe abriu a conexão e nesse caso ela mesmo fecharia, ou se recebeu uma conexão como parametro, e aí teria que ficar aberta ?
Desculpe as perguntas mas sou novo no c#, vb6 é bem diferente, rs.
GREGO 18/02/2011 21:45:12
#365929
Resposta escolhida
se a classe abriu sua propria conexão, quando o objeto for destruido a conexão tbm sera destruida, pode fazer o teste.

uma pratica legal é que nestas classe vc herde a interface IDisposable, esta interface contem um metodo chamado Dispose neste método voce pode destruir a conexão caso seja uma conexão propria do objeto, e você pode saber se a conexão e propria usando uma flag.
Tópico encerrado , respostas não são mais permitidas