Problema com Classes
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>
/
<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
Curtidas 0
Respostas
Fernando Reis
27/03/2009
Ola, Alguma resposta ?
GOSTEI 0
Luiz Maia
27/03/2009
Me mande o codigo da SP DeleteRegiao, por favor.
GOSTEI 0
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
27/03/2009
Fernando, preciso da SP = Stored Procedure.
Abraços
Att
Luiz Maia
GOSTEI 0
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
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
27/03/2009
Luiz,
Teste a Procedure e funiona Sim,
Apenas modifgiquei de
exec DeletaRegiao 3
para
exec DeleteRegiao 3
GOSTEI 0
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
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
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
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
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
27/03/2009
Usa o recurso abaixo:
if (!IsPostBack)
{
SeuMetodoAqui();
}
Abraços
Att
Luiz Maia
GOSTEI 0
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
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
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
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
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
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
27/03/2009
Fernando, o link esta errado.
Aguardo
Att
Luiz Maia
GOSTEI 0
Fernando Reis
27/03/2009
GOSTEI 0
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
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
27/03/2009
Olá,
Segue Script
https://www.devmedia.com.br/imagens/discovirtual/175404/ProjetoSetri/ScriptSQL.zip
GOSTEI 0
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
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
27/03/2009
Luiz,
pode postar a dúvida aqui mesmo, ok!
pode postar a dúvida aqui mesmo, ok!
GOSTEI 0
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
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
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
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
27/03/2009
Fernando,
a resposta do consultor solucionou o seu problema, podemos encerrar o chamado?
a resposta do consultor solucionou o seu problema, podemos encerrar o chamado?
GOSTEI 0
Fernando Reis
27/03/2009
Ola
Sim resolvido,
Obrigado Luiz,
GOSTEI 0
Luiz Maia
27/03/2009
Blz, Fernando.
Precisando é so falar.
Abraços
Luiz Maia
GOSTEI 0