SELECT PARA UM ARRAY

LUISCAMPANA12 27/11/2012 15:56:14
#414870
Pessoal boa tarde,

Estou com o seguinte problema tenho a instrução SQL dentro da minha CLASS. e criei um formulario de PEDIDOS ,
Entretanto consigo cadastrar , Consultar e blz.. a consulta retorna os itens do pedido no grid.. mais tenho o seguinte problema.. os dados que vao nos campos como ( nome, sobrenome , etc... ) eu nao consigo fazer eles retornarem da classe pelo array e ja irem direto para as textbox.. outra coisa que nao consigo fazer é editar os dados que ele carrega no grid.. quando eu salvo . ele salva novamente os itens no banco de dados .. com os mesmos dados. eu nao consigo modificar e nem incluir nenhum item . se alguem souber por favor ajudem .. gratoo


KERPLUNK 27/11/2012 16:38:52
#414876
Resposta escolhida
Conhece OOP? Conhece o conceito de List<T> ao invés de array? Seriam as primeiras coisas a entender. Não tenho como afirmar, mas tem grandes chances de você estar usando DataTables para fazer a consulta e passando o retorno direto para o grid. Se usar o conceito de OOP as coisas vão facilitar muito para você. Se usa SQL Server, fiz um gerador de CRUD todo OOP um tempo atrás, seria interessante você dar uma olhadinha nele. Mesmo que não use SQL Server, faça o teste nele e vai ver o que ele gera...
LUISCAMPANA12 28/11/2012 17:48:22
#414983
cara ... acho q nao soube explicar..

SEGUINTE :..>

EU FAÇO UM SELECT [...] FROM ITEM_PEDIDO WHERE ID = @ID ;

EM SEGUIDA
OS VALORES DO EU JOGO EM UM DATAGRID...

ESSE DATAGRID EU JOGO OS VALORES DELE DE VOLTA PRO FORM ... ELE CARREGA NA MINHA TELA NORMAL ..

POREM .. QUANDO EU CLICO EM SALVAR. - ELE ALTERA OS REGISTROS QEU ESTAO NA TABELA. ALTERA TUDO DIREITINHO ..
MAIS ELE NAO FAIZ O ROWS.CLEAR()... EU REPAREI QUE AS COLUNAS QUE JA ESTAVAM PRé CARREGADAS ELAS SOMEM E ENTRAM AS NOVAS QUE O SISTEMA TROUXE DO SELECT .. TEM ALGUMA FORMA DE EU TRAZER AS COLUNAS Q EU CRIEI DE VOLTA PRO GRID E LIMPAR O GRID ?
KERPLUNK 28/11/2012 18:11:54
#414984
Citação:

POREM .. QUANDO EU CLICO EM SALVAR. - ELE ALTERA OS REGISTROS QEU ESTAO NA TABELA. ALTERA TUDO DIREITINHO ..
MAIS ELE NAO FAIZ O ROWS.CLEAR()... EU REPAREI QUE AS COLUNAS QUE JA ESTAVAM PRé CARREGADAS ELAS SOMEM E ENTRAM AS NOVAS QUE O SISTEMA TROUXE DO SELECT .. TEM ALGUMA FORMA DE EU TRAZER AS COLUNAS Q EU CRIEI DE VOLTA PRO GRID E LIMPAR O GRID ?


Sim, quando fizer o select, jogue o resultado em uma List<T> de uma classe com as mesmas propriedades da sua tabela. Quando alterar alguma linha no grid, altere o ítem equivalente na sua lista. Então, sempre jogue essa lista para o grid.
LUISCAMPANA12 29/11/2012 09:46:06
#415005
cara estou com serios problemas pra desenvolver essa list <T> ai procurei por exemplos na net mais nenhum tem mto a ver com oq eu estou fazendo .. se possivel .. tem como vc me dar uma dica para criar essa list ???
meu código na class é o seguinte

public DataTable carrega_pedido(int id)
{
string vsql = [Ô]SELECT id,item,descricao,unidade,quant,valor FROM item_pedido where id_pedido = @idpedido[Ô];
SqlCommand sqlcmd = null;

if (this.conectar())
{
sqlcmd = new SqlCommand(vsql, objcon);
sqlcmd.Parameters.AddWithValue([Ô]idpedido[Ô],id);
SqlDataAdapter ADT = new SqlDataAdapter(sqlcmd);
DataTable dt = new DataTable();
ADT.Fill(dt);
return dt;
}
else
{
return null;
}
}


na hora de colocar pro retorno colocando isso na lista como eu faria ? por favor! - obrigado desde ja
KERPLUNK 29/11/2012 10:27:55
#415008
1 - Crie uma classe sugiro o nome ItemPedido. Nela, coloque as propriedades referentes ao retorno do select, no caso, id,item,descricao,unidade,quant,valor
2 - Para ler os dados, faça:

public DataTable carrega_pedido(int id)
{
string vsql = [Ô]SELECT id,item,descricao,unidade,quant,valor FROM item_pedido where id_pedido = @idpedido[Ô];
SqlCommand sqlcmd = null;

if (this.conectar())
{
sqlcmd = new SqlCommand(vsql, objcon);
sqlcmd.Parameters.AddWithValue([Ô]idpedido[Ô],id);
using (SqlDataReader dr = sqlcmd.ExecuteReader())
{
if (dr.HasRows)
{
List<PedidoItem> pedidos = new List<PedidoItem>();
while (dr.Read())
{
PedidoItem item = new PedidoItem();
item.Id = dr.GetInt32(dr.GetValue([Ô]id[Ô]));
item.Descricao = dr.GetString(dr.GetValue([Ô]descricao[Ô]));
[...]//carregue as outras propriedades, da mesma maneira como acima, usando o método apropriado, para string, use getstring, numérico, use getint32...

pedidos.Add(item);
}
}
}
//Pare o código aqui, e veja o conteúdo da variável pedidos na watch window....
return dt;
}
else
{
return null;
}
}

KERPLUNK 29/11/2012 10:30:57
#415009
O truque todo, é não usar os objetos de dados diretamente, sempre crie classes que representem o que o objeto do banco traz, mas com as propriedades e métodos da maneira como você quer
LUISCAMPANA12 29/11/2012 11:05:06
#415020
public DataTable carrega_novo_pedido(int id)
{
string vsql = [Ô]SELECT id,item,descricao,unidade,quant,valor FROM item_pedido where id_pedido = @idpedido[Ô];
SqlCommand sqlcmd = null;

if (this.conectar())
{
sqlcmd = new SqlCommand(vsql, objcon);
sqlcmd.Parameters.AddWithValue([Ô]idpedido[Ô], id);
using (SqlDataReader dr = sqlcmd.ExecuteReader())
{
if (dr.HasRows)
{
//id,item,descricao,unidade,quant,valor
List<PedidoItem> pedido = new List<PedidoItem>();
while (dr.Read())
{
PedidoItem item = new PedidoItem();
item.id = dr.GetInt32(dr.GetValue([Ô]id[Ô]));
item.item = dr.GetString(dr.GetValue([Ô]item[Ô]));
item.descricao = dr.GetString(dr.GetValue([Ô]descricao[Ô]));
item.unidade = dr.GetString(dr.GetValue([Ô]unidade[Ô]));
item.quant = dr.GetInt32(dr.GetValue([Ô]quant[Ô]));
item.valor = dr.GetDouble(dr.GetValue([Ô]valor[Ô]));


pedido.Add(item);

}
}
}


fiz essa nova funcao .. e criei a classe com as propriedades publicas


public class PedidoItem
{
//id,item,descricao,unidade,quant,valor

public int id;
public string item;
public string descricao;
public string unidade;
public int quant;
public double valor;





agora fiz tudo direitinho e tal.. para compilar ele apresenta o seguinte erro ..

Cannot convert from [ô]Object [ô] to [ô]int [ô]
KERPLUNK 29/11/2012 11:16:43
#415022
é quase certeza que é no campo ID, qual o tipo de dados dele no banco?
LUISCAMPANA12 29/11/2012 11:19:36
#415023
int.

mais ele esta dando em todas as outras linhas .. descricao unidade etc.. etc..

sei la pq , eu criei uma classe separada .. outro arquivo chamado pedidoitem como esta la

e agora .. o codigo fico todo certinho .. agora quando fui compila ele apareceu isso ai do objeto
KERPLUNK 29/11/2012 11:25:39
#415025
Caramba, me enganei, não é
[Ô]item.id = dr.GetInt32(dr.[txt-color=#e80000]GetValue[/txt-color]([Ô]id[Ô]));[Ô]

Mas sim:
item.id = dr.GetInt32(dr.[txt-color=#0000f0]GetOrdinal[/txt-color]([Ô]id[Ô]));


O mesmo para os outros, não é GetValue, e sim GetOrdinal. Eu não uso mais assim faz um tempo, uso métodos de extensão pra isso.
Página 1 de 3 [22 registro(s)]
Tópico encerrado , respostas não são mais permitidas