Inquiridor
Já foi adicionado um item com a mesma chave.

Pergunta
-
E aí pessoal. blz ??
Estou tendo um problema ao executar uma ActionResult Ao fazer executar, é exibida uma página de erro com a descrição
Server Error in '/' Application.
Já foi adicionado um item com a mesma chave.
Segue abaixo a codificação da ActionResult e da View
//insere ou altera o produto
public ActionResult InsereProduto(Produto p)
{
ProdutoDAL dal = new ProdutoDAL();
dal.InsereProduto(p);//insere ou altera o produto
return View("CadastroProduto");//atualiza a página
}//view
@model MODEL.Produto
@{
ViewBag.Title = "CadastroProduto";
}
@using (Html.BeginForm("InsereProduto","Produto",FormMethod.Post))
{
@Html.ValidationSummary(true)
<fieldset>
<legend>CADASTRO DE PRODUTO</legend>
<br />
<div class="editor-label">
<table>
<tr>
<td>@Html.LabelFor(model => model.ProdCode,"CÓDIGO:")</td>
<td>@Html.EditorFor(model => model.ProdCode)</td>
<td>@Html.ValidationMessageFor(model => model.ProdCode)</td>
</tr>
<tr>
<td>@Html.LabelFor(model => model.Descricao,"DESCRIÇÃO:")</td>
<td>@Html.TextAreaFor(model => model.Descricao)</td>
<td>@Html.ValidationMessageFor(model => model.Descricao)</td>
</tr>
<tr>
<td>@Html.LabelFor(model => model.CodBarra,"CÓD.BARRA:")</td>
<td>@Html.EditorFor(model => model.CodBarra)</td>
<td>@Html.ValidationMessageFor(model => model.CodBarra)</td>
</tr>
<tr>
<td>@Html.Label("UNIDADE:")</td>
<td>@Html.DropDownListFor(model => model.UnidMedId,(IEnumerable<SelectListItem>)ViewBag.Unidade)</td>
<td>@Html.ValidationMessageFor(model => model.UnidMedId)</td>
</tr>
<tr>
<td>@Html.Label("LINHA DE PRODUTO:")</td>
<td>@Html.DropDownListFor(model => model.LinprodId,(IEnumerable<SelectListItem>)ViewBag.ProdLinha)</td>
<td>@Html.ValidationMessageFor(model => model.LinprodId)</td>
</tr>
<tr>
<td>@Html.Label("SITUAÇÃO TRIBUTÁRIA:")
<td>@Html.DropDownListFor(model => model.TributarioId,(IEnumerable<SelectListItem>)ViewBag.Tributario)</td>
<td>@Html.ValidationMessageFor(model => model.TributarioId)</td>
</tr>
<tr>
<td>@Html.Label("CLASSIFICAÇÃO FISCAL:")</td>
<td>@Html.DropDownListFor(model => model.ClasfiscId,(IEnumerable<SelectListItem>)ViewBag.Clasfisc)</td>
<td>@Html.ValidationMessageFor(model => model.ClasfiscId)</td>
</tr>
<tr>
<td>@Html.LabelFor(model => model.PrecoCusto,"PREÇO DE CUSTO:")</td>
<td>@Html.EditorFor(model => model.PrecoCusto)</td>
<td>@Html.ValidationMessageFor(model => model.PrecoCusto)</td>
</tr>
<tr>
<td>@Html.LabelFor(model => model.PrecoTab,"PREÇO UNITÁRIO:")</td>
<td>@Html.EditorFor(model => model.PrecoTab)</td>
<td>@Html.ValidationMessageFor(model => model.PrecoTab)</td>
</tr>
<tr>
<td>@Html.LabelFor(model => model.ProdEstoque.QttEstoqueFisico,"QTT.ESTOQUE:")</td>
<td>@Html.EditorFor(model => model.ProdEstoque.QttEstoqueFisico)</td>
<td>@Html.ValidationMessageFor(model => model.ProdEstoque.QttEstoqueFisico)</td>
</tr>
<tr>
<td>@Html.LabelFor(model => model.ProdEstoque.QttMinEstoque,"QTT.ESTOQUE MÍNIMO:")</td>
<td>@Html.EditorFor(model => model.ProdEstoque.QttMinEstoque)</td>
<td>@Html.ValidationMessageFor(model => model.ProdEstoque.QttMinEstoque)</td>
</tr>
<tr>
<td>@Html.LabelFor(model => model.Status,"STATUS:")</td>
<td>@Html.DropDownListFor(model => model.Status,(IEnumerable<SelectListItem>)ViewBag.Status)</td>
<td>@Html.ValidationMessageFor(model => model.Status)</td>
</tr>
</table>
</div>
<br />
<p>
<input type="submit" value="SALVAR" />
<input type ="reset" value ="LIMPAR" />
</p>
</fieldset>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
O método que faz o Insert no banco de dados eu já utilizo em outros projetos, e funciona normalmente. Achei que fosse algum problema referente ao banco de dados, mas coloquei um breakPoint para depurar a execução do método, e percebi que nem mesmo está sendo executado. Alguém já viu esse tipo de erro ?
Todas as Respostas
-
-
-
E aí Rafael. Blz ?? Então, no método antes de inserir,é feita uma consulta para saber se o produto já consta na tabela. Se não constar insere, caso contrário, faz alteração nos dados de acordo com o código do produto, que é a chave primária. O que estou achando estranho, é que coloquei o breakPoint e o sistema parece estar parando antes da execução.
-
Opa. blz João ??
A primary key da tabela é o código do produto. A coluna não é de auto incremento(Identity), mesmo pq seu tipo é varchar. De qualquer forma, alterei o código da minha action, acresentando Bind(Exclude, como você sugeriu, mas o erro ainda continua.
-
-
Isso mesmo. Um amigo meu também achou que fosse algo referente a tabela no bd. Fez acesso remoto na minha máquina, e viu que não está nem mesmo executando a minha action. Por via das dúvidas, testamos um insert manualmente no BD, com os mesmos valores que estava tentando passar na página, e inseriu normalmente.
Cara, seja como for, fico muito agradecido pela atenção, não só a você, mas a todos que estão tentando ajudar.
-
cara queria então só saber como vc esta chamando a sua ActionResult
porque ela é um GET então vc precisa estar passando os parâmetros para ela já que ela esta esperando um objeto do tipo Produto!
entao ela é chamada a partir de um Redirect de outra Action os parâmetros estão sendo passado corretamente?
-
Realmente está faltando na sua Action o decorator do HTTP post: [HttpPost].
Nesse caso o MVC interpreta como duas requisições, uma para o post e outra para o get, e aí ocasiona o erro.
Coloque do jeito abaixo que irá funcionar:
[HttpPost] public ActionResult InsereProduto(Produto p)
- Editado João_ PradoModerator quarta-feira, 2 de outubro de 2013 22:32
-
Carlos boa noite, este tipo de problema geralmente é relacionado a banco de dados como o campo chave é do tipo varchar, verifica se o valor que esta chegando na variável em que você faz a condição para verificar se o produto esta cadastrado não esta com espaço antes ou depois do valor.
coloca ai o fonte do método dal.InsereProduto(p); para analise.
outra coisa faz tratamento de erro para não exibir esta tela.
-
-
Bom dia Marcos.
Desde o início achei que fosse relativo ao banco de dados, mas fiz um insert manualmente, com os mesmos valores que estava passando na página, e não houve erro. Além disso, no meu código, tem uma condição para inserir somente se o produto ainda não existir, e caso contrário, altera os valores de acordo com o código. Segue abaixo o método que faz o Insert:
//insere ou altera produto
public void InsereProduto(Produto p)
{
AbreConexao();
Cmd.Parameters.AddWithValue("@descricao", p.Descricao);
Cmd.Parameters.AddWithValue("@codBarra", p.CodBarra);
Cmd.Parameters.AddWithValue("@linprodId", p.LinprodId);
Cmd.Parameters.AddWithValue("@unidmedId", p.UnidMedId);
Cmd.Parameters.AddWithValue("@tributarioId", p.TributarioId);
Cmd.Parameters.AddWithValue("@clasfiscId", p.ClasfiscId);
Cmd.Parameters.AddWithValue("@precoCusto", p.PrecoCusto);
Cmd.Parameters.AddWithValue("@precoTab", p.PrecoTab);
Cmd.Parameters.AddWithValue("@estoque", p.ProdEstoque.QttEstoqueFisico);
Cmd.Parameters.AddWithValue("@estoqueMinimo", p.ProdEstoque.QttMinEstoque);
Cmd.Parameters.AddWithValue("@status", p.Status);
if (string.IsNullOrEmpty(p.ProdCode))//produto ainda não existe e será inserido
{
Cmd.CommandText = "SELECT ULTIMOPRODCODE FROM CONFIG";
Dr = Cmd.ExecuteReader();
Dr.Read();
Cmd.Parameters.AddWithValue("@prodCode", Global.GetInt(Dr["ULTIMOPRODCODE"].ToString()) + 1);//gera um novo código
FechaDataReader();
Cmd.CommandText = "INSERT INTO PRODUTO" +
"(PRODCODE,DESCRICAO,COD_BARRA,LINPROD_ID,UNIDMEDID,TRIBUTARIO_ID,CLASFISCID,PRECO_CUSTO,STATUS) " +
"VALUES" +
"(@prodCode,@descricao,@codBarra,@linprodId,@unidmedId,@tributarioId,@clasfiscId,@,precoCusto,@status)";
}
else//produto já existe e seus dados serão alterados
{
Cmd.Parameters.AddWithValue("@prodCode", p.ProdCode);
Cmd.CommandText = "UPDATE PRODUTO SET " +
"DESCRICAO = @descricao," +
"COD_BARRA = @codBarra," +
"LINPROD_ID = @linprodId," +
"UNIDMEDID = @unidmedId," +
"TRIBUTARIO_ID = @tributarioId," +
"CLASFISCID = @clasfiscId," +
"PRECO_CUSTO = @precoCusto," +
"STATUS = @status " +
"WHERE PRODCODE = @prodCode";
}
ExecutaQuery();
FechaConexao();
} -
-
Verifique se no seu Model tem dois parâmetros com o mesmo nome , os parametros são case insensitive. (é...)
Não dá pau na compilação e dá pau em execução.
Exemplo
se vc colocar isso no seu model :
[Required(ErrorMessage = "*")]
[StringLength(200)]
[Display(Name = "Email")]
[EmailAddress(ErrorMessage="Endereço de email inválido.")]
public string contato_email { get; set; }
[StringLength(200)]
public string contato_Email { get; set; }e no View :
<div class="editor-field">
@Html.EditorFor(model => model.contato_email)
@Html.ValidationMessageFor(model => model.contato_email)
</div>vai apresentar esse erro e chave duplicada, e não tem NADA a ver com base de dados , NADA!
Abraçao
L H Crivelli
- Editado Luiz Henrique B. Crivelli quinta-feira, 5 de dezembro de 2013 04:55
-
Verifique se no seu Model tem dois parâmetros com o mesmo nome , os parametros são case insensitive. (é...)
Não dá pau na compilação e dá pau em execução.
Exemplo
se vc colocar isso no seu model :
[Required(ErrorMessage = "*")]
[StringLength(200)]
[Display(Name = "Email")]
[EmailAddress(ErrorMessage="Endereço de email inválido.")]
public string contato_email { get; set; }
[StringLength(200)]
public string contato_Email { get; set; }e no View :
<div class="editor-field">
@Html.EditorFor(model => model.contato_email)
@Html.ValidationMessageFor(model => model.contato_email)
</div>vai apresentar esse erro e chave duplicada, e não tem NADA a ver com base de dados , NADA!
Abraçao
L H Crivelli
Olá,
Tive esse problema recentemente.
Retirei os dataannotions da model, mas continua o mesmo problema.
e Também não é problema no banco.
:(
-
-
Bom dia Carlos.
Vou passar para você uma solução que tive de um problema bem parecido.
Estava com uma classe "Post" que estava funcionando perfeitamente, então precisei criar um relacionamento com uma classe "Category", só que a classe "Category" estava com um nome e o controller dessa classe foi criada com um nome diferente "CategoriesController", quando criei o relacionamento, criei o relacionamento com o nome da classe que ficou assim:
public virtual Category Category { get; set; }
Isso me criou um problema no SQL Server o relacionamento ficou assim: "FK_dbo.Post_Categories_Category_CategoryId" provavelmente ele não entendeu que era um relacionamento e sim um novo campo de chave primária. A Solução foi simples, alterei o nome do relacionamento para:
public virtual Category Categories { get; set; }
Rodei o Migrations e ele consertou o erro automáticamente.
"FK_dbo.Post_Categories_CategoryId"
Bom! Espero ter ajudado.
Até.
David
- Editado David_Fico quinta-feira, 22 de março de 2018 13:50
- Sugerido como Resposta welington jrModerator quinta-feira, 12 de abril de 2018 18:29