Problema com Classes

27/03/2009

Amigos,     Estou com um problema Relacionado a op;áo de Delete por uma Classe,     Abaixo segue o Código da Página: <asp:GridView ID="grdRegiao" runat="server" AutoGenerateColumns="False" DataSourceID="dsRegiao" AllowPaging="True" DataKeyNames="CODIGO_REG"> <RowStyle CssClass="rowA" /> <Columns> <asp:TemplateField HeaderText="Edi‡Æo"> <ItemTemplate> <asp:LinkButton ID="lnkEdit" runat="server" CommandName="Select">Editar</asp:LinkButton> &nbsp; / <asp:LinkButton ID="lnkDelete" runat="server" CommandName="Delete" OnClientClick="return confirm('Deseja excluir esta REGIÇO? ')">Excluir</asp:LinkButton> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField="NOME_REG" HeaderText="RegiÆo" SortExpression="NOME_REG" /> </Columns> <HeaderStyle CssClass="rowH" /> <AlternatingRowStyle CssClass="rowB" /> </asp:GridView> <br /> <asp:ObjectDataSource ID="dsRegiao" runat="server" InsertMethod="Insert" SelectMethod="SelectRegiao" TypeName="Setri.Prominent.Regiao" DeleteMethod="DeleteRegiao"> <DeleteParameters> <asp:Parameter Name="CodigoId" Type="Int32" /> </DeleteParameters> <InsertParameters> <asp:Parameter Name="title" Type="String" /> </InsertParameters> </asp:ObjectDataSource>     Segue o Código da Classe:     using System; using System.Data; using System.Data.SqlClient; using System.Configuration; using System.Linq; using System.Web; using System.Web.Configuration; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Collections.Generic;     namespace Setri.Prominent { /// <summary> /// Classe de RegiÆo /// </summary> [System.ComponentModel.DataObject] public class Regiao { private static readonly string _connectionstring; private int _CODIGO_REG; private string _NOME_REG; public int CODIGO_REG { get { return _CODIGO_REG; } set { _CODIGO_REG = value; } } public string NOME_REG { get { return _NOME_REG; } set { _NOME_REG = value; } } static Regiao() { _connectionstring = WebConfigurationManager.ConnectionStrings["CsConexao"].ConnectionString; } public Regiao(SqlDataReader reader) { _CODIGO_REG = (int)reader["CODIGO_REG"]; _NOME_REG = (string)reader["NOME_REG"]; } /// <summary> /// Seleciona as Regiäes do Banco de Dados /// </summary> /// [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select,true)] public static List<Regiao> SelectRegiao() { //Inicializa o Command SqlConnection con = new SqlConnection(_connectionstring); SqlCommand cmd = new SqlCommand("SelectRegiao",con); cmd.CommandType = CommandType.StoredProcedure; List<Regiao> results = new List<Regiao>(); using (con) { con.Open(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { results.Add(new Regiao(reader)); } con.Close(); return results; } }   [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, false)] public static Regiao SelecById(int CategoryID) { //Initialize command SqlConnection con = new SqlConnection(_connectionstring); SqlCommand cmd = new SqlCommand("SelectRegiaoByID",con); cmd.CommandType = CommandType.StoredProcedure; //Initialize parameters cmd.Parameters.AddWithValue("@CODIGO_REG", CategoryID); Regiao result = null; using(con) { con.Open(); SqlDataReader reader = cmd.ExecuteReader(); if(reader.Read()) result =new Regiao(reader); } con.Close(); return result; } //<summary> //Create a new category //</summary> //<param name="parentId"></param> [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Insert, true)] public static void Insert(string title) { //Initialize command SqlConnection con = new SqlConnection(_connectionstring); SqlCommand cmd = new SqlCommand("InsertRegiao ", con); cmd.CommandType = CommandType.StoredProcedure; //Initialize parameters cmd.Parameters.AddWithValue("@NOME_REG", title); using (con) { con.Open(); cmd.ExecuteNonQuery(); } con.Close(); }   /// <summary> /// Update an existing category /// </summary> [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, true)] public static void Update(int CODIGO_REG, string NOME_REG) { // Initialize command SqlConnection con = new SqlConnection(_connectionstring); SqlCommand cmd = new SqlCommand("UpdateRegiao", con); cmd.CommandType = CommandType.StoredProcedure; // Initialize parameters cmd.Parameters.AddWithValue("@CODIGO_REG", CODIGO_REG); cmd.Parameters.AddWithValue("@NOME_REG", NOME_REG); using (con) { con.Open(); cmd.ExecuteNonQuery(); } con.Close(); }   /// <summary> /// Select a Category by Category Id /// </summary> [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, false)] public static Regiao SelectById(int CodigoId) { // Initialize command SqlConnection con = new SqlConnection(_connectionstring); SqlCommand cmd = new SqlCommand("SelectRegiaoById", con); cmd.CommandType = CommandType.StoredProcedure; // Initialize parameters cmd.Parameters.AddWithValue("@CODIGO_REG", CodigoId); Regiao result = null; using (con) { con.Open(); SqlDataReader reader = cmd.ExecuteReader(); if (reader.Read()) result = new Regiao(reader); } return result; con.Close(); }   /// <summary> /// Delete a category /// </summary> [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Delete, true)] public static void DeleteRegiao(int CodigoId) { // Initialize command SqlConnection con = new SqlConnection(_connectionstring); SqlCommand cmd = new SqlCommand("DeleteRegiao", con); cmd.CommandType = CommandType.StoredProcedure; // Initialize parameters cmd.Parameters.AddWithValue("@CODIGO_REG", CodigoId); using (con) { con.Open(); cmd.ExecuteNonQuery(); } } } }     O problem esta quando clico no Botão Excluir do GRid,   recebo esta mensagem.       Server Error in '/Setri' Application. ObjectDataSource 'dsRegiao' could not find a non-generic method 'DeleteRegiao' that has parameters: CodigoId, CODIGO_REG.       Podem me ajuda?         A stored Procedure e a Conexão,   estão Funcionando e os nomes dos parametros estão corretos!      
Fernando Reis

Fernando Reis

Curtidas 0

Respostas

Fernando Reis

Fernando Reis

27/03/2009

Ola,  Alguma resposta ?
GOSTEI 0
Luiz Maia

Luiz Maia

27/03/2009

Me mande o codigo da SP DeleteRegiao, por favor.
GOSTEI 0
Fernando Reis

Fernando Reis

27/03/2009

Ola Luiz,   Obrigado pelo Retorno,     Eu postei abaixo,   mas segue novamente.     [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Delete, true)] public static void DeleteRegiao(int CodigoId) { // Initialize command SqlConnection con = new SqlConnection(_connectionstring); SqlCommand cmd = new SqlCommand("DeleteRegiao", con); cmd.CommandType = CommandType.StoredProcedure; // Initialize parameters cmd.Parameters.AddWithValue("@CODIGO_REG", CodigoId); using (con) { con.Open(); cmd.ExecuteNonQuery(); } }   Obrigado,   Estou no aguardo
GOSTEI 0
Luiz Maia

Luiz Maia

27/03/2009

Fernando, preciso da SP = Stored Procedure. Abraços   Att Luiz Maia
GOSTEI 0
Fernando Reis

Fernando Reis

27/03/2009

Segue.   SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[DeleteRegiao] ( @CODIGO_REG int ) AS SET NOCOUNT OFF; DELETE FROM [TBL_REGIAO] WHERE (([CODIGO_REG] = @CODIGO_REG))
GOSTEI 0
Luiz Maia

Luiz Maia

27/03/2009

Fernando,   Se vc executar a Sp direto da base tipo abaixo, passando o Id como parametro   exec DeletaRegiao 3     Funciona? Abraços
GOSTEI 0
Fernando Reis

Fernando Reis

27/03/2009

Luiz,     Teste a Procedure e funiona Sim,   Apenas modifgiquei de   exec DeletaRegiao 3 para   exec DeleteRegiao 3     
GOSTEI 0
Fernando Reis

Fernando Reis

27/03/2009

Luiz,        Este problema não esta relacionado com o Envio do parametro?   Penso assim pois parei meu DEbug no Metodo de Delete dentro da Classe e ele Nem chega até lá,   ???   Abraço
GOSTEI 0
Luiz Maia

Luiz Maia

27/03/2009

Fernando,   De posse destas informações todas que me mandou, e não tendo resolvido o problema ainda, pesso que aguarde mais pois vou simular toda sua aplicação em minha maquina e ver se o erro persiste para mim tb, ok?   Te dou noticias mais tarde. Abraços   Att Luiz Maia
GOSTEI 0
Luiz Maia

Luiz Maia

27/03/2009

Fernando preciso que me mande seu projeto, pode compacta-lo e colocar no Disco Virtual para que eu corriga para vc?   Mas antes que faça isto, tente fazer uma busca em todo o projeto pelo metodo DeleteRegiao, nos arquivos XML gerados confira se esta tudo correto quanto aos parametros.   Vc esta usando o Linq ou EDM?   Abraços Att   Luiz Maia 
GOSTEI 0
Luiz Maia

Luiz Maia

27/03/2009

Fernando,   Descobri seu problema.   Consegui simular o erro aqui. Mude as seguintes tags em amarelo:   public static void DeleteRegiao(int CODIGO_REG) { // Initialize command SqlConnection con = new SqlConnection(_connectionstring); SqlCommand cmd = new SqlCommand("DeleteRegiao", con); cmd.CommandType = CommandType.StoredProcedure; // Initialize parameters cmd.Parameters.AddWithValue("@CODIGO_REG", CODIGO_REG); using (con) { con.Open(); cmd.ExecuteNonQuery(); } }   E no DataSource:   <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" DeleteMethod="DeleteRegiao" InsertMethod="Insert" SelectMethod="SelectRegiao" TypeName="Setri.Prominent.Regiao" UpdateMethod="Update"> <DeleteParameters> <asp:Parameter Name="CODIGO_REG" Type="Int32" /> </DeleteParameters> <UpdateParameters> <asp:Parameter Name="CODIGO_REG" Type="Int32" /> <asp:Parameter Name="NOME_REG" Type="String" /> </UpdateParameters> <InsertParameters> <asp:Parameter Name="title" Type="String" /> </InsertParameters> </asp:ObjectDataSource>   O projeto esta aqui, caso queira dar uma olhada:   http://video.devmedia.com.br/naoexclusivo/LuizMaia/Consultoria/fernando02.zip   Abraços e aguardo seu retorno. Att   Luiz Maia 
GOSTEI 0
Fernando Reis

Fernando Reis

27/03/2009

Luiz,     Quer dizer que o erro esta no Nome da Parâmetro,   poxa que coisa,   Eu consegui fazer esta funcionando, mas sinceramente não entendi o porque, ..   kkkk       Uma ultima pergunta,     Usei o mesmo método para o Insert e Update,  e funcionu também,     Veja o problema,   Abro um FormView,   Insiro o nome da Região Clico em Insert e automaticamente o GridView é Arrumado também,   mas se aperto o F5 (POSTBACK)  ELE ACRESCENTA O MESMO REGISTRO NOVAMENTE,   COMO RESOLVER ISTO?  
GOSTEI 0
Luiz Maia

Luiz Maia

27/03/2009

Usa o recurso abaixo:   if (!IsPostBack) {    SeuMetodoAqui(); }   Abraços   Att Luiz Maia
GOSTEI 0
Fernando Reis

Fernando Reis

27/03/2009

Luiz,     Conheço sim esta opção, sem problema, mas minha dúvida é, No Formulário que estamos conversando, este não possui Métodos, As informações estâo nas Classes fora da página,   Então como utilizar o   IF (!ispostBack) nesta situação?   Fernando    
GOSTEI 0
Luiz Maia

Luiz Maia

27/03/2009

Mas o formulario que vc fala é um arquivo .aspx? Se é ele tem um metodo PagaLoad, dai vc faz a chamada lá. Aguardo seu retorno.   Abraços Att Luiz Maia
GOSTEI 0
Fernando Reis

Fernando Reis

27/03/2009

Ola Luiz,   Desculpe a demora em responder,   Esta Pagina da Devmedia me causou problemas,   mas voltando ao assunto,     Aplicado a este Tõpico,   pode me enviar um Modelo?     Veja,   No arquivo que estamos trabalhando  eu ENTENDO que nâo pousso nenhum método..   Seja ele de Inserção, Deleção ou alteração.  Este estão implicitos dentro do ObjectDataSource,     Então minha pergunta... ]       Como me referenciar a estes metodos implicitos no Page_load??       Obrigado pela ajuda                    
GOSTEI 0
Luiz Maia

Luiz Maia

27/03/2009

Fernando,   De onde vem seu DataSource? DataSet tipado, DataAdapter, Xml ou outros???   Como é feito o evento de Insert, tem clique em algum botao ou etc? Tem como me mandar esta parte do sistema? Pode colocar no DiscoVirtual e eu baixo aqui.   Abraços Att Luiz Maia
GOSTEI 0
Fernando Reis

Fernando Reis

27/03/2009

Ola Luiz,   Deculpe náo estar sendo claro em minha Pergunta,   Coloquei o Arquivo em meu Disco Virtua,   la tem todo o projeto,   A pagina esta na Pasta Comerial\regiao.aspx   Meu problema e  quanto ao POSTBACK na pagina   agradeco sua ajuda.   Link:   https://www.devmedia.com.br/imagens/discovirtual/175404/Setri
GOSTEI 0
Luiz Maia

Luiz Maia

27/03/2009

Fernando,   Antes que eu olhe o arquivo (vou baixa-lo agora) tente fazer o seguinte:   no page load da pagina:   if (!Ispostback) {    seuGridView.Bind(); }
GOSTEI 0
Luiz Maia

Luiz Maia

27/03/2009

Fernando, o link esta errado. Aguardo   Att Luiz Maia
GOSTEI 0
Luiz Maia

Luiz Maia

27/03/2009

Tentou o que te pedi no post abaixo? Vou baixar o projeto agora, pois ontem tivemos problemas com Internet. Assim que eu der uma olhada te mando a solução.   Att Luiz Maia
GOSTEI 0
Luiz Maia

Luiz Maia

27/03/2009

Fernando   Preciso que vc me mande o script de criação da base de dados para que eu possa simular seu ambiente. Ja vi seu projeto e vi que esta usando o FormViewer.   Seu problema é quando vc insere uma nova região e esta fica no estado da pagina, ai ao recarregar a pagina e mesma é inserida novamente, o que temos que fazer é dar um dispose no FormViewer, mas para que eu tenha certeza do que precisamos fazer, preciso da sua base de dados instanciada em minha maquina, por favor me mande.     Pode gravar o script de criaçao das tabelas num arquivo .txt e colocar no Disco Vistual, ai eu baixo ele aqui, ok?   Estou aguardando. Abraços   Att Luiz Maia
GOSTEI 0
Fernando Reis

Fernando Reis

27/03/2009

GOSTEI 0
Luiz Maia

Luiz Maia

27/03/2009

Ola Fernando, Pesquisei bastante aqui e ate consultei o suporte da Microsoft. Na verdade a recuperação do estado dos parametros é um recurso do browser, do qual o proprio usuario é informado que o browser ira recuperar os parametros e refazer a ação, como pode ver na img abaixo, da sua propria aplicação em minha maquina:     Mas, eu consegui uma solução alternativa, que resolve seu problema. Veja os passos abaixo de como proceder:     Clicar no dataSource dsRegiaoID e cliar o evento Inserted, como abaixo:   protected void dsRegiaoID_Inserted(object sender, ObjectDataSourceStatusEventArgs e) { Response.Redirect("Regiao.aspx"); }   Veja que depois de inserido, a pagina é invocada novamente, o que faz com que o estado seja renovado.   Caso tenha alguma duvida, pegue a aplicação no link abaixo e confira.   http://video.devmedia.com.br/naoexclusivo/LuizMaia/Consultoria/setri.zip     Abraços Att Luiz Maia 
GOSTEI 0
Fernando Reis

Fernando Reis

27/03/2009

Luiz,   Resolvido,   Tenho uma outra dúvida com Classes na Parte de Inserção,   Fechamos este Post a abrimos outro ou falamos por aqui?   Grande abraço.
GOSTEI 0
Devmedia

Devmedia

27/03/2009

Luiz,
pode postar a dúvida aqui mesmo, ok!
GOSTEI 0
Fernando Reis

Fernando Reis

27/03/2009

Ola Luiz,


Veja ainda o Exemplo que estamos conversando,


na Classe de Região eu tenho o Método  INSERTREGIAO


este método recebe todos os dados na Chamada do Método

por Exemplo



Classe:
Public Sub InsertRegiao(string StrRegiao)

End Sub


Chamada:
InsertRegiao ('Regiao 01')



Como posso fazer para que o Método receba as informaçções das propriedades do Método?


Exemplo:

property _regiao as string

Public Sub InsertRegiao()

     Insert into tbl_regiao (regiao)values(_regiao)

End Sub




Chamada:

Dim clsRegiao as new clsregiao
With clsRegiao
     .Regiao = 'Regiao 01'
End With


Pergunto isto pois neste Exemplo que estou utilizando (arquivo que baixou)não consigo fazer a chamada da propriedade.


Obrigado


GOSTEI 0
Luiz Maia

Luiz Maia

27/03/2009

Fernando, Como vc esta usando a interação toda Wizard (ComponenteModel) para acesso a dados, sua aplicação fica totalmente engessada.
O que vc fez está correto, seu metodo deve ficar da forma que vc escreveu mesmo, sem parametros na assinatura e so esta falatando vc usar o atributo (this/me): Public Sub InsertRegiao()      Insert into tbl_regiao (regiao) values (this._regiao) End Sub
Suas propriedades tb deve ser publicas, tente o seguinte:  public class SuaClasse
 {
  
  private string teste1
  private string teste2;   public SuaClasse
  {
   this.Teste1 = null;
   this.Teste2 = null;
  }
  
  public string Teste1
  {
   get { return teste1}
   set { teste1 = value; }
  }   public string Teste2
  {
   get { return teste1; }
   set { teste1 = value; }
  }  }   Aguardo seu contato. Att Luiz Maia
GOSTEI 0
Devmedia

Devmedia

27/03/2009

Fernando,
a resposta do consultor solucionou o seu problema, podemos encerrar o chamado?
GOSTEI 0
Fernando Reis

Fernando Reis

27/03/2009

Ola   Sim resolvido,   Obrigado Luiz,    
GOSTEI 0
Luiz Maia

Luiz Maia

27/03/2009

Blz, Fernando. Precisando é so falar. Abraços Luiz Maia
GOSTEI 0
POSTAR