none
Erro de sobrecarga - ExecuteNonQuery RRS feed

  • Pergunta

  • Olá,

    Gostaria de saber se no comando OleDb existe um número máximo de parâmetros a serem adicionados, pois no meu código, quando eu adiciono 3 parâmetros ele roda normal e atualiza o DB, mas quando eu coloco mais valores ele dá erro de sobrecarga no comando ExecuteNonQuery().

    Seria pelo números de valores que eu tento colocar ao mesmo tempo ou algum erro no código?

    Segue o código :

            private void button2_Click(object sender, EventArgs e) 
            { 
                OleDbConnection cn = new OleDbConnection(@"Data Source='D:\Meus Projetos\E-Commerce\E-Commerce\E-Commerce\bd1.mdb';Persist Security Info=True; Provider=Microsoft.Jet.OLEDB.4.0"); 
                using (cn) 
                 { 
     
                    OleDbCommand cmd = new OleDbCommand("INSERT INTO CADASTRO_MEDICO ( NOME , ENDERECO , CIDADE , ESTADO , EMAIL , TELEFONE , CELULAR , ESPECIALIDADES , ATENDIMENTO ) VALUES ( ? , ? , ? , ? , ? , ? , ? , ? , ? )", cn); 
                    cmd.Parameters.Add(new OleDbParameter("NOME", txtNome.Text)); 
                    cmd.Parameters.Add(new OleDbParameter("ENDERECO", txtEndereco.Text)); 
                    cmd.Parameters.Add(new OleDbParameter("CIDADE", txtCidade.Text)); 
                    cmd.Parameters.Add(new OleDbParameter("ESTADO", txtEstado.Text)); 
                    cmd.Parameters.Add(new OleDbParameter("EMAIL", txtEmail.Text)); 
                    cmd.Parameters.Add(new OleDbParameter("TELEFONE", txtTelefone.Text)); 
                    cmd.Parameters.Add(new OleDbParameter("CELULAR", txtCelular.Text)); 
                    cmd.Parameters.Add(new OleDbParameter("ESPECIALIDADES", txtEspecialidades.Text)); 
                    cmd.Parameters.Add(new OleDbParameter("ATENDIMENTO", txtAtendimento.Text)); 
     
                    cn.Open(); 
     
                    cmd.ExecuteNonQuery(); 
     
                    label1.Text = "Registros inseridos com sucesso"
     
                    cn.Close(); 
                } 
            } 
     

    Agradeço desde já.

    Até mais.
    domingo, 1 de fevereiro de 2009 12:01

Respostas

  • Olá Bruno,

    Você definiu os campos Telefone e Celular como sendo numéricos, e pelo visto o OleDb não faz a conversão automaticamente... Assim, você terá de enviar os valores já convertidos no parâmetro, com o tipo correto, de acordo com o que você definiu no tipo do campo. Algo como:

     
        // ... 
     
        cmd.Parameters.Add(new OleDbParameter("@TELEFONE"Convert.ToDouble(txtTelefone.Text))); 
        cmd.Parameters.Add(new OleDbParameter("@CELULAR"Convert.ToDouble(txtCelular.Text))); 
     
        // ... 
     


    De qualquer forma, acho que você deveria pensar seriamente se faz sentido esses campos serem numéricos...

    Abraços,
    Caio Proiete


    Caio Proiete
    http://www.caioproiete.com
    • Marcado como Resposta Bruno Caetano segunda-feira, 2 de fevereiro de 2009 10:55
    segunda-feira, 2 de fevereiro de 2009 10:34
    Moderador

Todas as Respostas

  • Olá Bruno,

    Provavelmente existe um limite, mas com certeza esse limite não é tão pequeno assim, para ser alcançado com menos de dez parâmetros.

    Creio que exista algum problema com a instrução SQL, como nomes de campos errados, por exemplo, ou ainda, você pode estar tentando inserir texto em algum campo numérico... Existem muitas possibilidades.

    Se você mostrar a mensagem de erro exata que ocorre, talvez possamos ajudar...

    Abraços,
    Caio Proiete


    Caio Proiete
    http://www.caioproiete.com
    domingo, 1 de fevereiro de 2009 14:52
    Moderador
  • Olá Caio,

    As seguintes imagens mostram o DB em modo design, no modo de visualização normal e a mensagem de erro, respectivamente.

    DB em modo design:
    http://img237.imageshack.us/img237/2764/imgbdiu1.jpg

    DB no modo de visualização:
    http://img99.imageshack.us/img99/1273/imgaccessgi7.jpg

    Mensagem de erro:
    http://img237.imageshack.us/img237/6550/imgerrojd1.jpg

    Bem, espero que possam me ajudar. Obrigado desde já.

    Até mais
    domingo, 1 de fevereiro de 2009 15:07
  • oi... procurei no google como OleDbException Overflow e achei uma serie de artigos sobre o mesmo...

    aqui foi um dos que li... se nao servi da uma pesquisa com calma...
    Answer OleDBException Overflow

    basicamente la o cara usa Excel ao inves de Access e a soluçao foi usar paramentros com nomes:

    private void button2_Click(object sender, EventArgs e) {  
       OleDbConnection cn = new OleDbConnection(@"Data Source='D:\Meus Projetos\E-Commerce\E-Commerce\E-Commerce\bd1.mdb';Persist Security Info=True; Provider=Microsoft.Jet.OLEDB.4.0");  
        using (cn) {  
           OleDbCommand cmd = new OleDbCommand("INSERT INTO CADASTRO_MEDICO ( NOME , ENDERECO , CIDADE , ESTADO , EMAIL , TELEFONE , CELULAR , ESPECIALIDADES , ATENDIMENTO ) VALUES ( @NOME , @ENDERECO , @CIDADE , @ESTADO , @EMAIL , @TELEFONE , @CELULAR , @ESPECIALIDADES , @ATENDIMENTO)", cn);  
           cmd.Parameters.Add(new OleDbParameter("@NOME", txtNome.Text));  
           cmd.Parameters.Add(new OleDbParameter("@ENDERECO", txtEndereco.Text));  
           cmd.Parameters.Add(new OleDbParameter("@CIDADE", txtCidade.Text));  
           cmd.Parameters.Add(new OleDbParameter("@ESTADO", txtEstado.Text));  
           cmd.Parameters.Add(new OleDbParameter("@EMAIL", txtEmail.Text));  
           cmd.Parameters.Add(new OleDbParameter("@TELEFONE", txtTelefone.Text));  
           cmd.Parameters.Add(new OleDbParameter("@CELULAR", txtCelular.Text));  
           cmd.Parameters.Add(new OleDbParameter("@ESPECIALIDADES", txtEspecialidades.Text));  
           cmd.Parameters.Add(new OleDbParameter("@ATENDIMENTO", txtAtendimento.Text));  
      
           cn.Open();  
      
           cmd.ExecuteNonQuery();  
      
           label1.Text = "Registros inseridos com sucesso";  
      
           cn.Close();  
        }  
    }  

    domingo, 1 de fevereiro de 2009 15:18
    Moderador
  • Olá Bruno,

    Desconfio que tenha alguma relação com o tamanho dos campos, ou então com o tipo dos campos telefone e celular que são numéricos (!), e você não está passando um parâmetro fortemente tipado.


    Sugiro que faça um primeiro teste, passando somente valores fixos para ver se funciona, e se funcionar depois vá substituindo um por um, até achar o campo "problemático":

     
        cmd.Parameters.Add(new OleDbParameter("NOME""Maria")); 
        cmd.Parameters.Add(new OleDbParameter("ENDERECO""Rua 1")); 
        cmd.Parameters.Add(new OleDbParameter("CIDADE""Campinas")); 
        cmd.Parameters.Add(new OleDbParameter("ESTADO""SP")); 
        cmd.Parameters.Add(new OleDbParameter("EMAIL""xxx")); 
        cmd.Parameters.Add(new OleDbParameter("TELEFONE", 50)); 
        cmd.Parameters.Add(new OleDbParameter("CELULAR", 60)); 
        cmd.Parameters.Add(new OleDbParameter("ESPECIALIDADES""esp")); 
        cmd.Parameters.Add(new OleDbParameter("ATENDIMENTO""atend"));  
     


    Abraços,
    Caio Proiete


    Caio Proiete
    http://www.caioproiete.com
    domingo, 1 de fevereiro de 2009 15:43
    Moderador
  • Rui Santos disse:

    oi... procurei no google como OleDbException Overflow e achei uma serie de artigos sobre o mesmo...

    basicamente la o cara usa Excel ao inves de Access e a soluçao foi usar paramentros com nomes:



    Olá Rui,

    De fato o tópico que você encontrou está marcado como sendo a solução para o problema, mas acho que foi algum engano de quem marcou o tópico como resposta, porque o OleDb não suporta parâmetros com nomes.

    Abraços,
    Caio Proiete



    Caio Proiete
    http://www.caioproiete.com
    domingo, 1 de fevereiro de 2009 15:49
    Moderador
  • Caio... realmente achei estranho... mas o cara tava usando Excel...

     Na verdade usei muito pouco o OleDb tmb.... vai q tinha alguma atualizaçao a esse respeito ^^

    Mas entao fica só a dica de pesquisa... as veses é mais facil achar o erro se vc conseguir descobrir a mensagem em ingles ^^

    domingo, 1 de fevereiro de 2009 16:13
    Moderador
  • Rui,

    mas qual a mensagem de erro exata?
    Ricardo Oneda
    http://oneda.mvps.org/blog

    domingo, 1 de fevereiro de 2009 16:55
  • eh "Overflow" kkkk tmb achei estranho... mas era essa mensagem que tinha no stacktrace do cara

     

    System.Data.OleDb.OleDbException was unhandled
      ErrorCode=-2147217833
      Message="Overflow"
      Source="Microsoft JET Database Engine"
      StackTrace:
           at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)

    domingo, 1 de fevereiro de 2009 22:28
    Moderador
  • Bem, depois de seguir o que o Caio disse, executei com valores fixos e depois fui testando um por um, e cheguei até o txtCelular e o txtTelefone, que dão erro toda vez que os completo.

    Justamente os campos numéricos.

    O que poderia ser feito para consertar isso?

    Muito obrigado pela ajuda de vocês.

    Até mais.
    segunda-feira, 2 de fevereiro de 2009 02:28
  • Olá Bruno,

    Você definiu os campos Telefone e Celular como sendo numéricos, e pelo visto o OleDb não faz a conversão automaticamente... Assim, você terá de enviar os valores já convertidos no parâmetro, com o tipo correto, de acordo com o que você definiu no tipo do campo. Algo como:

     
        // ... 
     
        cmd.Parameters.Add(new OleDbParameter("@TELEFONE"Convert.ToDouble(txtTelefone.Text))); 
        cmd.Parameters.Add(new OleDbParameter("@CELULAR"Convert.ToDouble(txtCelular.Text))); 
     
        // ... 
     


    De qualquer forma, acho que você deveria pensar seriamente se faz sentido esses campos serem numéricos...

    Abraços,
    Caio Proiete


    Caio Proiete
    http://www.caioproiete.com
    • Marcado como Resposta Bruno Caetano segunda-feira, 2 de fevereiro de 2009 10:55
    segunda-feira, 2 de fevereiro de 2009 10:34
    Moderador
  • Olá Caio,

    Fiz as alterações no código e mesmo assim ele continuou dando erro de sobrecarga. Mas resolvi mudar os campos no DB para texto, e aí o programa rodou normalmente.

    Sou iniciante em programação e nunca tinha mexido com Access antes, por isso tantas perguntas e dúvidas.

    Muito obrigado por me ajudar.

    Abraços,
    Bruno Caetano

    segunda-feira, 2 de fevereiro de 2009 10:55
  • "De fato o tópico que você encontrou está marcado como sendo a solução para o problema, mas acho que foi algum engano de quem marcou o tópico como resposta, porque o OleDb não suporta parâmetros com nomes."

    Olá Caio,

    É verdade que o OleDb não suporta parâmetros, mas se usar os parâmetros ele ignora e funciona na mesma. O que é obrigatório é que a ordem que foram indicados seja a ordem que são depois atribuidos.


    @Bruno,

    Eu não entendo muito bem porque se usa parameters e depois não se faz uma das coisas mais importantes na sua definição: o tipo de dados. Mas é um erro muito comum!

    Pode tentar alterando assim ? Indicando o tipo ele faz a conversão automaticamente.

    cmd.Parameters.Add("CELULAR"OleDbType.Integer).Value = txtCelular.Text; 


    No entanto é estranho e penso que o problema é que voce definiu como campo para o "celular" um tipo de dados que não suporta o tamanho total de um celular. Como alterou para texto ele já aceitou. Pode confirmar isso ?
    quarta-feira, 4 de fevereiro de 2009 09:55
  • Olá Jorge,

    Não sei se o Access não conseguia fazer a conversão ou não suportava o tipo de dados, mas quando alterei o campo Celular de Numérico para Texto ele aceitou normalmente.

    Depois vou tentar como você disse e posto o resultado aqui ok?

    Abraços,
    Bruno Caetano
    quarta-feira, 4 de fevereiro de 2009 20:02
  •  Bruno,

    Que tipo de dados escolheu no Access (no campo numérico) para o campo celular e pode-me dar um exemplo de um celular no Brasil ?

    quarta-feira, 4 de fevereiro de 2009 20:16