Fórum Problema com Classes #4113
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>
/
<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!
Posts
Me mande o codigo da SP DeleteRegiao, por favor.
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
Fernando, preciso da SP = Stored Procedure.
Abraços
Att
Luiz Maia
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))
Fernando,
Se vc executar a Sp direto da base tipo abaixo, passando o Id como parametro
exec DeletaRegiao 3
Funciona?
Abraços
Luiz,
Teste a Procedure e funiona Sim,
Apenas modifgiquei de
exec DeletaRegiao 3
para
exec DeleteRegiao 3
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
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
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
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
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?
Usa o recurso abaixo:
if (!IsPostBack)
{
SeuMetodoAqui();
}
Abraços
Att
Luiz Maia
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
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