Array
(
)

Inserir com problema. Asp.Net (Upgrade da Concessionária)

Fcarvalho
   - 15 nov 2014

Fala galera, tudo bem?
Eu estou dando um up no programa da Concessionária do curso de formação básica de asp aqui do portal, hoje cedo estava tudo funcionando normalmente no código que mostrarei abaixo, mas não sei por qual motivo o código simplesmente parou de inserir o nome do produto e o valor na tabela. Segue abaixo os códigos.
Esse código busca os dados da peça que foi clicado anteriormente em uma outra pagina, ele funciona corretamente.
#Código

 protected void Page_Load(object sender, EventArgs e)
    {

        string strCon = ConfigurationManager.ConnectionStrings["carmediaConnectionString"].ConnectionString;
        string SQL = "select * from pecas where id = @id";
        string ID = Request.QueryString["id"];

        using(MySqlConnection con = new MySqlConnection(strCon)){
        
            using (MySqlCommand cmd = new MySqlCommand(SQL, con)){
                con.Open();
                if (con.State == System.Data.ConnectionState.Open)
                {
                    cmd.Parameters.AddWithValue("@id", Convert.ToInt32(ID));

                    MySqlDataReader dr = cmd.ExecuteReader();

                    if (dr.Read()) {

                        txtDescricao.Text = dr["descricao"].ToString();
                        lblMarca.Text = dr["Marca"].ToString();
                        lblPreco.Text = dr["preco"].ToString();
                        lblNomePeca.Text = dr["nome"].ToString();
                        lBtnComprar.PostBackUrl = "Interesse_pecas.aspx?pecas=" + dr["descricao"].ToString() + " " + dr["marca"].ToString();
                        imgHlCarro.ImageUrl = "../Marcas/" + dr["marca"].ToString() + ".jpg";
                        imgHlCarro.NavigateUrl = "../Marcas/" + dr["marca"].ToString() + ".jpg";
                        imgHlCarro.Attributes.Add("rel", "lightbox");
                    }
                }
            }
        }

    }


Em seguida eu utilizei este outro código para pegar apenas o nome dessa peça e o preço dela e colocar em uma tabela de produtos que tem os campos nome e preço.
#Código
rotected void btnCarrinho_Click(object sender, EventArgs e)
    {
        //Chama a conectividade para o banco de dados.
        string strCon = ConfigurationManager.ConnectionStrings["carmediaConnectionString"].ConnectionString;
        string SQL = "INSERT INTO produtos (nmproduto, preco) VALUES ("; SQL += " @nmproduto, @preco)";


        //Configura conexão
        using (MySqlConnection conn = new MySqlConnection(strCon))
        {

            using (MySqlCommand cmd = new MySqlCommand(SQL, conn))
            {
                conn.Open();
                cmd.Parameters.AddWithValue("@nmproduto", lblNomePeca.Text);
                cmd.Parameters.AddWithValue("@preco", lblPreco.Text);

                if (cmd.ExecuteNonQuery() > 0)
                {
                    lblMensagem.Text = "Carro cadastrado com sucesso!";
                }
                else
                {
                    lblMensagem.Text = "Erro ao inserir a peça!";
                }
            }

        }
    }

Mistérios da vida? Este código estava funcionando até cadastrar 3 produtos, depois parou de funcionar! Então excluir a tabela e criei uma nova, mas nada até agora. :(
Alguém pode me ajudar?

Fcarvalho
   - 16 nov 2014

Galera, eu sei que meu problema são essas duas linhas que não estão pegando o valor, alguém tem ideia do que seja?

#Código

  cmd.Parameters.AddWithValue("@nmproduto", lblNomePeca.Text);
                cmd.Parameters.AddWithValue("@preco", lblPreco.Text);

Jothaz
   - 16 nov 2014

Faça este teste:

#Código

   cmd.Parameters.AddWithValue("@nmproduto", lblNomePeca.Text.ToString());
   cmd.Parameters.AddWithValue("@preco", lblPreco.Text.ToString());

Fcarvalho
   - 16 nov 2014

Jothaz,

da esse erro aqui quando tento fazer isso:

The best overloaded method match for 'MySql.Data.MySqlCliente.MySqlParameterCollecion.AddWithValue(string, object)' has come invalid arguments

Jothaz
   - 16 nov 2014


Citação:
Jothaz,

da esse erro aqui quando tento fazer isso:

The best overloaded method match for 'MySql.Data.MySqlCliente.MySqlParameterCollecion.AddWithValue(string, object)' has come invalid arguments


Amigo foi mal. É que a muito tempo não uso o MySQL e você deve passar o objeto, no SQL Server você passa um tipo.

Então retire o .ToString().

Retorna algum erro ou só não executa a instrução?

Você já debugou linha a linha e verificou se os valores estão ok?

Fcarvalho
   - 16 nov 2014


Citação:

Citação:
Jothaz,

da esse erro aqui quando tento fazer isso:

The best overloaded method match for 'MySql.Data.MySqlCliente.MySqlParameterCollecion.AddWithValue(string, object)' has come invalid arguments


Amigo foi mal. É que a muito tempo não uso o MySQL e você deve passar o objeto, no SQL Server você passa um tipo.

Então retire o .ToString().

Retorna algum erro ou só não executa a instrução?

Você já debugou linha a linha e verificou se os valores estão ok?


Tentei debugar aqui colocando o Breaking point no botão nos valores mas passo direto, não to entendendo o que ta acontecendo. Enfim, com .ToString(). Não deu erro, mas também não inseriu ainda.

[Update]
Suspeitando que não foi até o breaking point, eu resolvi fazer um teste e coloquei o botão pra mostrar uma mensagem, mas nem isso funcionou. Vou tentar criar uma classe nova, se eu tiver novidades vou postar aqui.

Jothaz
   - 16 nov 2014

Insira:
#Código

            try
            {
               ...eu código......

            }
            catch (Exception ex)
            {
                throw;
            }


Pois se existir algum erro será capturado, além de ser uma ótima prática.

Outra sugestão:
#Código

cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue............

Fcarvalho
   - 16 nov 2014


Citação:
Insira:
#Código

            try
            {
               ...eu código......

            }
            catch (Exception ex)
            {
                throw;
            }


Pois se existir algum erro será capturado, além de ser uma ótima prática.

Outra sugestão:
#Código

cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue............



Refiz a classe com a sua sugestão do Try Catch, realmente pegou um erro alegando duas conexões, então removi uma. O Debug funcionou agora também, e as labels estão recebendo os valores no botão, porem ainda não inseriu no BD produtos.

Jothaz
   - 16 nov 2014

Acho que esta faltando é isto:

#Código

                conn.Open();
				
				cmd.CommandType = CommandType.Text;
				cmd.CommandText = SQL;	
                
	       cmd.Parameters.AddWithValue("@nmproduto", lblNomePeca.Text);
                cmd.Parameters.AddWithValue("@preco", lblPreco.Text);



Atribiuir o seu SQL para cmd.CommandText, teste e retorne.

Fcarvalho
   - 16 nov 2014

kkkkkkkkkkkk

Olha as ideia desse programa, eu coloquei o cmd.ExecuteReader(); depois da função e deu certo! Inseriu 3 vezes! Depois parou de inserir de novo kkkkkkkkkkkkkkkkk não sei se rio ou choro.

Fcarvalho
   - 16 nov 2014


Citação:
Acho que esta faltando é isto:

#Código

                conn.Open();
				
				cmd.CommandType = CommandType.Text;
				cmd.CommandText = SQL;	
                
	       cmd.Parameters.AddWithValue("@nmproduto", lblNomePeca.Text);
                cmd.Parameters.AddWithValue("@preco", lblPreco.Text);



Jothaz, deu certo! E inseriu com seu código! Mas aí de novo só deu 3 resultados. Você não vai acreditar o que estava dando errado. Eu só estava testando 3 resultados antes de aplicar o "postbackurl" da interface gráfica do Visual Studio, aí reparei que era sempre depois que eu colocava o postbackurl que parava de inserir, então além de ter colocado o seu código eu tirei o postback da interface gráfica e implementei ele.

Fico assim:

#Código

protected void btnInserirProduto_Click(object sender, EventArgs e)
    {

        try
        {
            //Chama a conectividade para o banco de dados.
            string strCon = ConfigurationManager.ConnectionStrings["carmediaConnectionString"].ConnectionString;
            string SQL = "INSERT INTO produtos (nmproduto, preco) VALUES ("; SQL += " @nmproduto, @preco)";


            //Configura conexão
            using (MySqlConnection conn = new MySqlConnection(strCon))
            {
                conn.Open();

                using (MySqlCommand cmd = new MySqlCommand(SQL, conn))
                {
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = SQL;
                    cmd.Parameters.AddWithValue("@nmproduto", lblNomePeca.Text.ToString());
                    cmd.Parameters.AddWithValue("@preco", lblPreco.Text.ToString());
                    cmd.ExecuteReader();
                }

            }
        }
        catch (Exception ex)
        {
            throw;
        }

        btnInserirProduto.PostBackUrl = "~/Cliente/compra_peca.aspx";
    }



E agora deu certo! Muito obrigado Jothaz!

Jothaz
   - 16 nov 2014

De nada!

Lembre-se, sempre, mas sempre mesmo use o Try Catch, sem ele fica difícil capturar os erros.

Existe o finally do try catch, se vi discussões intermináveis na validade do seu uso, mas pode facilitar a vida, pois só será executado após o fim de tudo que esta no try:

#Código

        try
        {
           ......
        }
        catch (Exception ex)
        {
            throw;
        }
        finally
        {
		
        }		


E sempre tenha paciência, pois muitas das vezes o problema é simples, mas nossa ações para saná-lo ,só piora.

Debug é seu melhor companheiro. E o do Visual Studio é top.

Fcarvalho
   - 16 nov 2014


Citação:
De nada!

Lembre-se, sempre, mas sempre mesmo use o Try Catch, sem ele fica difícil capturar os erros.

Existe o finally do try catch, se vi discussões intermináveis na validade do seu uso, mas pode facilitar a vida, pois só será executado após o fim de tudo que esta no try:

#Código

        try
        {
           ......
        }
        catch (Exception ex)
        {
            throw;
        }
        finally
        {
		
        }		


E sempre tenha paciência, pois muitas das vezes o problema é simples, mas nossa ações para saná-lo ,só piora.

Debug é seu melhor companheiro. E o do Visual Studio é top.

Ok, muito obrigado mesmo Jothaz! Ao término eu deixo ele aqui pra download.