Usuário com melhor resposta
Erro de sobrecarga - ExecuteNonQuery

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.
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
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 -
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
-
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(); } }
-
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 -
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 -
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 ^^
-
-
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) -
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.
-
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
-
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
-
"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 ? -
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
-