Campo mes Trunca os dados! PQ?

28 respostas
jpacheco

Bom e o seguinte eu tenho um jsp assim:

ele faz upload num arquivo csv e depois insere os dados no banco meu banco e constituido assim:

ele antes funcionava tranquilamente foi entaum q resolvi mudar o campo mes(int) para mes(varchar de 4) ele fazia as buascas e inseria na tabela tudo correto so q surgia umas pas assim

ao lado dos campos na tabela isso ocasinava erro e eu qria so transformar o mes de int( numeros tipo 06, 07, 08, 09…) para String(jan, fev, mar) e ele dava este erro, bom dai qs voltar a fazer com numeros pois axei um funcão q trasnforma os numeros em texto dai , so q dai começo a dar problema tipo ele da um erro assim

diz q todos so campos da fileira um foram truncados para o mes mas pq isso se antes tudo ocorria corretamente??? isso e um problema na tabela ou no arquivo csv??? pq tipo no jsp n deve ser pq n mexi nada nele e antes funcionava!!! a unica coisas q fiz foi qmudei o csv e depois ateh fiz outros n sei se isso pode dar erro, e tbn mudei o campo mes de int(2) para varchar(4) e tipo agora ja coloquei denovo como era e ele da este erro ateh escrevi a tabela denovo mas n adianta!!!pq sera q acontece isso
Bom galera fico no aguardo ai qm puder me ajudar valew!!!

28 Respostas

T

a) Tome um calmante primeiro - chá de folhas de maracujá, por exemplo.
Como disse o Parreira na entrevista depois do jogo contra Gana, pressa != velocidade.

b) Pra resolver problemas esquisitos, quebre-o em pedaços. Veja, por exemplo, se o tal arquivo CSV está correto.

Não se esqueça que em um arquivo CSV, strings são gravadas de forma diferente de números. Por exemplo:

“1,23”;1,23

No primeiro caso você tem a string 1,23 e no segundo o número 1,23. Se você criou o CSV como número e vai tentar ler como string talvez dê algum chabu.

jpacheco

hum mm mas como por exemplo!! eu sei como eu salavo o csv em numero ou em String?? pq eu simplesmente tenho o arquivo no Excel(xsl) e passo ressalvo ele em csv tem algum diferencial quando se executa este processo???

T

Use o Bloco de Notas (Notepad) para abrir o arquivo .CSV, para ver se ele está no formato correto.

Se for usar o Excel para checar o arquivo .CSV, você sabe se foi gravado como “123” (string) ou 123 (número) se você reparar na formatação - se for string, ele fica alinhado à esquerda. Se for número, ele fica alinhado à direita.

jpacheco

entao ele e String pq esta alinhado a esquerda mas tipo isso influncia na parde de fazer a inserção e dar o erro q informei???

T

O que ocorre no seu programa é que você tem campos no banco de dados que não são VARCHAR ou CHAR, e você está usando setString com eles. O que ocorre? Depende muito do seu driver de banco de dados. Muitos drivers são meio “idiotas” e dão problemas sérios.

Em vez de fazer setString para todos os campos, veja qual é o tipo de cada um deles, e use o método adequado (setInt, setString etc.). Veja a documentação de PreparedStatement e escolha o método mais adequado.

http://java.sun.com/j2se/1.5.0/docs/api/java/sql/PreparedStatement.html

jpacheco

hummm!! n sou muito bom nessa parte veio!! pois ateh entaum n programa em java mas to me metendo pra aprender!! e q tipo como vc pode ver eu tenho o Buffer

depois o eu entro com o PreparedStatement

entaum eu faço um laço para ele entrar em ação

depois eh passo o arquivo passado no Buffer para uma String para ler ele linha a linha!!

entaum logo em seguinda eu crio uma vetor de strings para inserir o “;”
entre os dados

depois eu faço um for para ele para pegar todos os dados

e entaum eu seto os dados

e logo em seguinda faço u Update nos dados!!

so e q na parte ali em cima q me enrolo tipo eu fiz um setString neh
soq tipo os dados saum:
uma String, dois floats e tres int

e tipo eu teria de fazer setInt e setFloat???
eu me enrolo nisso pq ele vai pegar uma linha por linha e ainda os dados estao todos na mesma linha por isso q n consigo entender muito bem esta parte de setar os dados um usuario em falow q deveria fazer o setString dos dados e tipo antes de ter feito akilo de passar o mes para varchar atehq funcionava!!
mas agora ele da o erro q citei logo acima!!!

J

Verifique lá no seu arquivo csv se não está vindo valores acima de 2 dígitos para o campo mes int(2).

jpacheco

aqui esta o arquivo csv na seguinte ordem:

cc_custo, impressoes, valImpress, copias, valCopias e mes

e assim e para ir para o banco mas trunca no int mes
no PreparedStatement ja trokei o mes pelo valCopias e da o mesmo erro so q dai pro val Copias axo q ou e a tabela ou o csv so n sei o q!!

J

Adiciona lá onde é executado o stmt.executeUpdate(); o comando

e.printStackTrace()

e manda o que é exibido no log aí pra galera ver melhor em que ponto está dando o erro.

jpacheco

cara olha so eu usei assim logo depois do stm

o out.println(e.getMessage()); pegou ste erro

e o

pego este:

olha cara antes funcionava antes de eu mudar sabe!! dai depois q mudei e coloquei denovo como era n funcionou mais!!
e algo na tabela no campo mes ou entaum no csv isso com certeza eh!! mas n sei o q pode ser!!

J

É, acho que você vai ter que trocar o setString() pelo set de cada campo dependendo do seu tipo, assim como o Thingol comentou anteriormente.
Não conheço MySql por isso não vou poder te ajudar nesse sentido.

Tente assim:

PreparedStatement stmt= con.prepareStatement("INSERT INTO custos(cc_custo, impressoes, valImpress, copias, valCopias, mes) values (?, ?, ?, ?, ?, ?)"); 

  String linha = "";
  String[] dados = null;

while(br.ready()){ 
  linha = br.readLine(); 
  dados = linha.split(";"); 
  
  stmt.setString(1, dados[0]); 
  stmt.setInt(2, Integer.parseInt(dados[1])); 
  stmt.setFloat(3, Float.parseFloat(dados[2])); 
  stmt.setInt(4, Integer.parseInt(dados[3])); 
  stmt.setFloat(5, Float.parseFloat(dados[4])); 
  stmt.setInt(6, Integer.parseInt(dados[5])); 
}

A sim, e outra coisa, como você mesmo disse que voltou a versão anterior e continou dando erro é por que você está, então, executando coisa velha aí, não? Ou então, sai do fusca e entra de novo (fecha a IDE, reinicia o tomcat, refaz o deploy), sabe como é informática, não é uma ciência exata, ainda.

jpacheco

sei sim e ja fexei isso aki e abri umas qntas vezes e n estou usando o tomcat para testes e sim um plugin do eclipse o exadel n sei se vc conhece ele tem um tomcat embutido!!! e bem legal

mas veio fiz como vc falou e ele de este erro agora:

e deu esta execão e.printStackTrace

isso e alguma coisa relacionada com o dado 6 ou seja o mes denovo !!! n entendo veio como q isto funicinava e n funciona mais so pq alterei umas coisas mas depois deixei tudo igual!!!

J

O seu último elemento da linha do arquivo CSV está vindo com uma aspas (6"), daí é passado uma string ao invés de um número para o setFloat. Acho que é isso.

Verifique o arquivo e veja se não está sendo gerado errado.

Nesse comando linha.split(";") não deve ter espaço em branco antes nem depois do ponto e vírgula.

jpacheco

n n!! ele n tem " do lado do ultimo campo naum!!! eu inclusive passei o arquivo csv ali acima se quiser dar uma olhada eu passei ele e expliquei o q cada um significa!! e n a espaços no (";") o problema n sera no banco??? o mes pode ser int(2) ???se estou passando so um numero no csv para ele???

J

Naninanão…

Veja lá na mensagem de erro que foi listada pelo stacktrace

java.lang.NumberFormatException: For input string: "6"" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:4:)

A mensagem For input string: “6"” é listada com um aspas a mais, ou seja, o erro é listado dentro de aspas já, então, o 6 veio e, junto com ele, uma aspas.

Eu fiz um teste aqui e forcei esse erro da seguinte maneira:

System.out.println(Float.parseFloat("6\""));

Coloque o código acima num método main() qualquer, execute e você obterá o seguinte erro:

java.lang.NumberFormatException: For input string: "6""

Bom, posso estar enganado, mas faça um debug desse seu código, passo a passo e veja o conteúdo das variáveis.

jpacheco

cara era erro ao salvar o CSV eu deixava uns campos em brancos qndo passava de xls para csv e depois q eu apagava mas devia ser no Excel q deivia ser apagado mas de resto agora ta funfando so tipo ele ta dando esta Excessão ainda da uma olhada:

se souber me avisa e valew ai pela força!!

J

Agora é contigo.

Vá lá no diretório de instalação do tomcat, exemplo:

C:\Tomcat50\work\Catalina\localhost<SUA APLICACAO>\org\apache\jsp

e procure pelo arquivo upload_jsp.java e veja a linha 106. É nessa linha que está dando NullPointerException

Os arquivos .java/.class desse diretório são seus arquivos .JSP (no caso upload.jsp), só que agora, compilados, ok?

Veja o resultado do stacktrace,

impressoras.csv 
java.lang.NullPointerException 
at java.io.File.<init>(File.java:194) 
at org.apache.jsp.admin.upload_jsp._jspService(upload_jsp.java:106) 
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
....
....

Parece que é na hora de você criar uma instância da classe File, você deve estar passando algum valor null pra ela.

jpacheco

nao olha so em ora alguma eu passo valores nulos quando crio as instancias olha so:

se passo pelo menos n notei!!!

J

jpacheco, se você não cooperar, fica difícil…

Você olhou o arquivo que te falei??

Vá lá e coloca aqui um trecho do arquivo, umas linhas antes e umas linhas depois da 106.

Let’s go man…move !!!

jpacheco

cara desculpa ai n tinha me ligado mas olha so o negocio e o seguinte tenho o tomcat mas nele n to usando minha aplicação ainda sabe mas la o que tem na linha 106 e esta instancia:

eu to fazendo os testes num plugin q uso no eclipse q e o exadel n sei se conhece

e dai n sei onde q fica localizada a aplicação se dentro do eclipse, do exadel ??

bem no exadel fui la da uma olhada e n tem nada dentro da seguinte apsta:

bom dai tem outra pasta q fica a aplicação???

J

Como eu não sei o que é esse exadel e você não tem uma estrutura do tomcat que é o que eu conheço, faça o seguinte.

Dê uma olhada no texto abaixo e coloque o seguinte comando
System.out.println(“Passo 1”);

Assim:

System.out.println("Passo 1");
while (i.hasNext())  { 
  System.out.println("Passo 2");
  actual = (FileItem)i.next(); 
  System.out.println("Passo 3");
  String fileName = actual.getName(); 
  System.out.println("Passo 4 - nome= " + fileName);
  File arquivo = new File(fileName); 
  System.out.println("Passo 5 - arquivo= " + arquivo);
...
...
}
System.out.println("Passo n");

E assim sucessivamente até o final do loop (while), não esquecendo de incrementar o número o que será impresso, pra poder saber em que ponto ele vai parar.

Entendeu? Execute e veja o que será impresso no console do Eclipse.

jpacheco

cara o exadel e um plugin tri bom q tem diversas funções q vaum desde ter um proprio tomcat como poder usar struts jsf xml entre outros e tri bom mesmo(pena q n sei usar quase nada das funções dele eheh) bom mas veio fiz assim coloquei o teu while logo abaixo do meu while q faz a iinserção dos dados no banco n sei se fiz certo e fiz umas mudanças nele para n ocarionar erro de variaves duplicadas da uma olhada

e ele me troxe o seguinte resultado no console:

pelo visto o FileItem actual esta recebendo parametros nulos n eh??

J

Então, era o que eu tinha lhe falado antes.

Aqui

File arquivo2 = new File(fileName1);

está tentando instanciar um File com valor null (fileName1).

Blz, isso você já sabe né. Agora você vai ter que pedalar pra verificar o por quê disso.

Tens que saber por que actual.getName() está retornando null. Vai ver que nesse caso esse método retorna null mesmo.

Até aqui eu fui, agora não sei mais como te ajudar pois nunca usei FileItem.

Pesquise no javadoc sobre esse carinha. Boa sorte.

jpacheco

ok ok!!! vou dar uma olhada tbn mas eu tbn nunca tinha usado o FileItem hehe!! mas olha so cara esta Excessão n vai ocasionar problemas n minha aplicação ou ocasionaria???

J

Ué, já está causando problemas. Você não está conseguindo nem carregar o arquivo.

Pelo que eu notei, a sua aplicação, por enquanto, não está conseguindo fazer com que um determinado procedimento funcione corretamente.

Primeiro tens que corrigir esse problema, nem que para isso você coloque um try - catch só pra pegar esse erro e exibir uma mensagem amigável na tela.

Toda exceção deve ser tratada, ou específica ou generalizada, mas tem que ser tratada.

jpacheco

eu ja tenho um try catch nela e eu estou conseguindo sim fazer o insert dos dados na tabela q unica coisa q eu n consigo fazer o o upload do arquivo para o servidor mas isso eu axo q eo problema e qndo eu instancio o File pq qndo eu coloco getServletContext().getRealPath("/admin/arquivo_csv") ele n funciona mas qndo eu passo o caminho inteiro desde a raiz da maquina ele faz!!!

mas tipo como vc faria para passar a msg amigavel na tela? n seria so colocar um out.println logo abaixo do catch???

J

No seu caso aí, é uma.

jpacheco

feito!! veio !!! valew pela ajuda mesmo!!! vc me tirou varias duvidas!! valew mesmo!!!

Criado 28 de junho de 2006
Ultima resposta 29 de jun. de 2006
Respostas 28
Participantes 3