none
Erro RRS feed

  • Pergunta

  • Olá,

    Estou com um pequeno probleminha.

    Criei um a nova página para um sistema já existente.

    Essa minha página faz um insert:

    INSERT INTO Pedidos( idProduto, produto, quantidade, valor) SELECT idProduto, produto, 1, valor FROM Produtos WHERE [codigo] = " + TextBox1.Text

    e da o seguinte erro:

     

    The conversion of the nvarchar value '7896019355193                                                                                       ' overflowed an int column. Maximum integer value exceeded.
    The statement has been terminated.

     

    O estranho é que esse número 78960... é o número do primeiro produto da tabela. E se eu deleto ele,

    aparece o segundo e se eu deleto o segundo aparece o terceiro...

     

    Obs: Esse número é do código do produto.

     

    E mais estranho ainda é que se eu deleto todos os produtos e começo a cadastrar novos produtos, mesmo que sendo iguais aos antigos, da certo!!!

     

    Mas eu não posso deletar todos produtos do meu cliente e fazer ele cadastrar tudo de novo.

     

    Agradeço a todos que postarem.

     

    quinta-feira, 19 de junho de 2008 18:53

Todas as Respostas

  • Olá Eduardo,

     

    O fato é que o número 7896019355193 é grande demais para um inteiro e por isso um erro. Qual o tipo de dados da coluna código da tabela Produto ?

     

    [ ]s,

     

    Gustavo

     

    quinta-feira, 19 de junho de 2008 19:03
  • nchar(100)

    mas não quer dizer,

    pois se eu deletar todos os produtos e cadastrar esse produdo com esse código 7896019355193, tudo igual,

    da certo.

    quinta-feira, 19 de junho de 2008 19:07
  • Ok,

     

    Experimente colocar esse número entre aspas simples

     

    [ ]s,

     

    Gustavo

     

    quinta-feira, 19 de junho de 2008 19:19
  • Olá Eduardo,

     

    O erro exibiu o número assim: '7896019355193                                                                                       '

     

    Veja que a aspa está sendo fechada lá na frente. Parece besteira, mas dê um TRIM neste campo (TextBox1.Text) antes de fazer a inserção.

     

    Um abraço,

    Raul Santos

     

     

    quinta-feira, 19 de junho de 2008 19:25
  • O que é dar um trim?

     

    quinta-feira, 19 de junho de 2008 19:35
  • Boa Tarde,

     

    Como o campo é CHAR não creio que fará diferença o TRIM, mas de qualquer forma...

     

    INSERT INTO Pedidos( idProduto, produto, quantidade, valor) SELECT idProduto, produto, 1, valor FROM Produtos WHERE [codigo] = RTRIM('" + TextBox1.Text + "')"

     

    [ ]s,

     

    Gustavo

     

     

     

    quinta-feira, 19 de junho de 2008 19:38
  • Se eu coloco entre aspas simples ele cadastra de boa.

    O que devo fazer?

     

    sexta-feira, 20 de junho de 2008 17:29
  • Oi,

    Cara se eu coloco entre aspas simples da certo, pq?

    O que devo fazer?

     

     

    segunda-feira, 23 de junho de 2008 17:30
  • Eduardo,

     

    Tente utilizar o SET Quoted_Identifier para fazer a sua substituir o uso de aspas simples por duplas, basicamente é isso que esta diretiva realiza.

     

    segunda-feira, 23 de junho de 2008 17:59
  • Como assim?

    segunda-feira, 23 de junho de 2008 18:01
  • Olá Eduardo,

     

    Você precisa ajudar a gente a entender o que está acontecendo.

     

    Em qual linguagem você está desenvolvendo? VB, C#, ASP.NET?

     

    Você disse que colocando aspas simples funciona, certo? Onde você colocou aspas simples e onde você realizou este teste? E porque não pode usar assim? Não tem como você colocar um pedaço maior do teu código pra gente analisar?

     

    Do jeito abaixo, não está funcionando?

    Code Snippet

    "INSERT INTO Pedidos( idProduto, produto, quantidade, valor)

    SELECT idProduto, produto, 1, valor

    FROM Produtos WHERE [codigo] = LTRIM(RTRIM('" + TextBox1.Text + "')) "

     

     

    Se não estiver, qual erro está dando?

     

    Um abraço,

    Raul Santos

    segunda-feira, 23 de junho de 2008 21:52
  • Olá Raul, trabalho com c#,

    tenho o seguinte código:

     

    SqlConnection Conn = new SqlConnection();

    Conn.ConnectionString = ConfigurationManager.ConnectionStrings["LotericaConnectionString"].ConnectionString;

    Conn.Open();

    SqlCommand Comm = Conn.CreateCommand();

    Comm.CommandText = "INSERT INTO Pedidos( idProduto, produto, quantidade, valor) SELECT idProduto, produto, 1, valor FROM Produtos WHERE [codigo] = " + TextBox1.Text;

    Comm.ExecuteNonQuery();

    Conn.Close();

    Conn.Close();

    TextBox1.Text = "";

    GridView1.DataBind();

     

    Tenho um textBox que eu coloco o código, quando eu aperto enter ele adiciona o produto na tabela pedidos conforme o código.

    Este código funcionou perfeitamente, mas quando eu peguei uma cópia do banco de dados do meu cliente para fazer testes, não funcionou. Percebi que se eu deletasse todos dados e cadastresse todos novamente, mesmo que fossem iguais, não dava mais problemas. Mas não vou fazer meu cliente cadastrar tudo de novo. Então o amigo ae pra cima sugeriu que quando eu fosse inserir o código, colocasse ele entre aspas simples, Funcinou! Então eu gostaria de saber qual é o problema e o que devo fazer.

     

    terça-feira, 24 de junho de 2008 17:57
  • Olá Eduardo,

     

    O problema é que a nova cópia do database provavelmente esteja com o campo [codigo] como sendo do tipo CHAR, conforme citado pelo Gustavo. Logo, se você comparar um texto com um número, você terá problemas (erros!). Por isso o Gustavo sugeriu colocar as aspas simples, ou seja, comparar texto com texto.

     

    Você tem duas opções:

    1. Usar o código como sugerido pelo Gustavo:

    Code Snippet
    Comm
    .CommandText = "INSERT INTO Pedidos( idProduto, produto, quantidade, valor) SELECT idProduto, produto, 1, valor FROM Produtos WHERE [codigo] = LTRIM(RTRIM('" + TextBox1.Text + "')) ";

     

     

    2. Olhar a base do seu cliente e conferir se o tipo de dados do campo [codigo] é realmente CHAR (ou varchar) e se for, estudar a possibilidade de alterar o tipo de dados para, provavelmente, INT.

     

    Um abraço,

    Raul Santos

    terça-feira, 24 de junho de 2008 19:04
  • Olá Raul,

    eu usei esse código que tu colocaste na opção 1. E acontece o mesmo erro.

    Se eu tento trocar o dataType de nchar para int ele não deixa pois existem produtos cadastrados na tabela.

    Tem algum jeito de eu forçar essa troca?

    terça-feira, 24 de junho de 2008 19:19
  • Olá Eduardo,

     

    1. Qual erro deu na aplicação ao colocar daquele jeito (com aspas simples)? Erro do SQL ou erro de sintaxe do C#? Poste aqui pra gente ver.

    2. Ao tentar alterar o datatype de nchar para int deu erro ou deu um "warning"? Se deu erro, provavelmente existam campos preenchidos com caracteres nesta base. Rode a query abaixo para verificar se existe algum registro que não seja numérico nesta coluna. Se o resultado for maior que ZERO, você tem registros que são caracteres.

    Code Snippet

    select count(*)

    from Tabela --// trocar pelo nome da tua tabela

    where isnumeric(codigo) = 0

     

     

    Um abraço,

    Raul Santos

     

     

     

    terça-feira, 24 de junho de 2008 22:07
  • Os erros acontecem somente quando eu não coloco aspas simples:

     

    1.quando eu coloco um código com menos de treze dígitos aparece o seguinte:

    The conversion of the nvarchar value '7895800305065                                                                                       ' overflowed an int column. Maximum integer value exceeded.
    The statement has been terminated.

     

    Esse número que aparece é o código de um registro(não o primeiro da tabela, mas o primeiro com 13 dígitos)

    se eu deletar ele, vai aparecer o código do próximo registro com 13 dígitos no código.

     

    2.quando eu coloco um código com treze dígitos:

    Arithmetic overflow error converting nvarchar to data type numeric.
    The statement has been terminated.

     

     

    O resultado da query foi = 0. Ou seja. Não tenho registros com caracteres.

    Percebi mais uma coisa, quando vou o campo código da tabela produtos de nchar(100) para int ele da o seguinte erro:

     

    'Produtos' table
    - Warning: Data might be lost converting column 'codigo' from 'nchar(100)'.

     

    Aperto yes:

     

    'Produtos' table
    - Unable to modify table. 
    The conversion of the nvarchar value '7895800308738                                                                                       ' overflowed an int column. Maximum integer value exceeded.
    The statement has been terminated.

     

    dou Ok

     

    O usuáio cancelou fora da caixa de diálogo de salvar

    (MS Visual Database Tools)

     

    Estou ficando louco!!

    Abraço.
    quarta-feira, 25 de junho de 2008 17:19