none
Erro ao tentar evitar dados duplicados (C# e SQL SERVER) RRS feed

  • Pergunta

  • Olá, para evitar a inserção de dados duplicados fiz o seguinte. No banco de dados existe uma tabela chamada MARCA, essa tabela tem apenas dois campos (IdMarca INT NOT NULL IDENTITY PK, Nome VARCHAR(35)). Para o campo nome eu criei uma chave UNIQUE então não é possível inserir duas marcas que contenham o mesmo nome, porém não estava conseguindo via aplicação retornar esse erro para o usuário, vejam o código abaixo:

     
    using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
                {
                    SqlCommand cmmd = new SqlCommand("STPRMarca", conn);
                    cmmd.CommandType = CommandType.StoredProcedure;
                    cmmd.Parameters.AddWithValue("@Opc", _INSERT);
                    cmmd.Parameters.AddWithValue("@Nome", marcaModel.Nome);
                    try
                    {
                        cmmd.Connection.Open();
                        cmmd.ExecuteNonQuery();
                    }
                    catch(SqlException ex)
                    {
                        switch (ex.Number)
                        {
                            case 2627:
                                System.Windows.Forms.MessageBox.Show($"UNIQUE KEY {ex.Message}");
                                break;
                        }
    
                        return false;
                    }
    
                    return true;
                }

    foi aí então que decidi fazer o seguinte executar o comando via texto ao invés de executar a procedure que estava utilizando

    using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
                {
                    SqlCommand cmmd = new SqlCommand("INSERT INTO Marca (Nome) VALUES (@Nome)", conn);
                    cmmd.Parameters.AddWithValue("@Nome", marcaModel.Nome);
                    try
                    {
                        cmmd.Connection.Open();
                        cmmd.ExecuteNonQuery();
                    }
                    catch(SqlException ex)
                    {
                        switch (ex.Number)
                        {
                            case 2627:
                                System.Windows.Forms.MessageBox.Show($"UNIQUE KEY {ex.Message}");
                                break;
                        }
    
                        return false;
                    }
    
                    return true;
                }

    Dessa forma aí em cima o código funcionou, mas porque funcionou via texto e não por procedure?

    quarta-feira, 10 de janeiro de 2018 11:18

Todas as Respostas