| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/04/2009 23:37:47
|
osvaldol
Smalltalk
Membro desde: 13/04/2009 20:56:33
Mensagens: 4
Offline
|
Pessoal,
Estou tentando importar um arquivo .txt para um BD e a aplicação está apresentando o seguinte erro:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
Minha Classe Importacao:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JOptionPane;
public class Importacao {
private File file;
private StringBuffer sb;
private FileReader reader;
private BufferedReader bufReader;
private String lugar;
private String arquivo;
private String caminho_Completo;
public String var;
public String linha = "";
public String sql;
String agencia,conta,documento,valor,banco,lote, sequencial, motivo;
public Importacao(String arquivo)
{
this.lugar = "c:\\Osvaldo";
this.arquivo = arquivo;
this.caminho_Completo = getLugar() +"\\"+arquivo;
this.var = "";
this.linha = "";
this.agencia = " ";
this. conta = "";
this. documento = "";
this.valor = "";
this. banco = "";
this.lote = "";
this. sequencial = "";
this.motivo = "";
this.sql = "";
file = new File(getCaminho_Completo());
sb = new StringBuffer();
}
public String getLugar()
{
return lugar;
}
public String getArquivo()
{
return arquivo;
}
public String getCaminho_Completo()
{
return caminho_Completo;
}
public void importa(Conexao1 con){
try{
reader = new FileReader(file);
bufReader = new BufferedReader(reader);
while (linha!=null) {
linha = bufReader.readLine();
if (linha.charAt(32)== ' ' )
{
continue;
}
agencia = linha.substring(3, 7);
conta = linha.substring(7, 16);
documento = linha.substring(17, 23);
valor = linha.substring(24, 34);
banco = linha.substring(38,41);
lote = linha.substring(41,4 ;
sequencial = linha.substring(48, 51);
motivo = linha.substring(51, 53);
Cheque_DSR cheque_DSR = new Cheque_DSR(agencia, conta, documento, valor, banco, lote, sequencial, motivo);
String sql_inclusao = "INSERT INTO tbldsr733(agencia, conta, documento, valor, banco, lote, sequencial, motivo)";
sql_inclusao += "values('"+cheque_DSR.getAgencia()+"'"+cheque_DSR.getConta()+"'"+"'"+cheque_DSR.getDocumento()+"'"+"'"+cheque_DSR.getValor()+"'"+"'"+cheque_DSR.getBanco()+"'"+"'"+cheque_DSR.getLote()+"'"+"'"+cheque_DSR.getSequencial()+"'"+"'"+cheque_DSR.getMotivo()+"')";
con.Executa_SQL(sql_inclusao);
if (linha!=null) {
sb.append( linha + "\r\n" );
}
}
// while (linha!=null);
// while (linha!=null);
bufReader.close();
reader.close();
con.Fecha_Conexao();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
E minha classe Conexao1:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JOptionPane;
import java.sql.PreparedStatement;
public class Conexao1 {
private Connection connection;
private Statement statement;
private ResultSet rs,resultSet;
private ResultSetMetaData resultSetMD;
private PreparedStatement Pstatement;
private String caminho;
private boolean conexao_aberta;
private String usuario;
private String senha;
public int i = 0;
public Conexao1(String caminho, String usuario, String senha)
{
this.caminho = caminho;
this.usuario = usuario;
this.senha = senha;
this. conexao_aberta = false;
}
public Connection getconnection()
{
return connection;
}
public Statement getstatement()
{
return statement;
}
public ResultSet getresultSet()
{
return rs;
}
public String getCaminho()
{
return caminho;
}
public String getUsuario()
{
return usuario;
}
public String getSenha()
{
return senha;
}
public void setCaminho(String c)
{
if ( Conexao_Aberta() )
Fecha_Conexao();
//
if ( c.length() < 22 )
caminho = "jdbc:mysql://" + "10.34.101.180" + ":3306/" + "rotinas";
else
caminho = c;
}
public String Abre_Conexao()
{
String resp="";
try
{
// cria a conexao
connection = DriverManager.getConnection(getCaminho(),getUsuario(),getSenha());
statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE,ResultSet.HOLD_CURSORS_OVER_COMMIT);
statement = connection.createStatement();
// consulta o banco de dados
Pstatement = connection.prepareStatement("select agencia,conta,documento,valor,banco,lote,sequencial,motivo from tblDsr733",ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = Pstatement.executeQuery();
rs.next();
//
resp=resp.concat("Conexão ABERTA\n");
conexao_aberta = true;
}
catch (SQLException sqlException)
{
resp=resp.concat("Conexão NÃO estabelecida\n");
}
//
return resp;
}
public String Executa_SQL(String x)
{
int retorno = 0;
String resp = "";
if ( conexao_aberta )
{
try
{
System.out.println(x);
retorno = statement.executeUpdate(x);
resp=resp.concat("Sentença SQL executada com sucesso!\n");
}
catch (SQLException sqlException)
{
resp=resp.concat("Erro ao tentar executar a sentença SQL\n");
}
}
else
{
resp=resp.concat("A Conexão se encontra fechada\n");
}
//
return resp;
}
// public void Inserir_BD(){
// connection.
// }
public String Fecha_Conexao()
{
String resp = "";
//
if ( conexao_aberta )
{
try
{
// Executa_SQL("Update Contatos set Nome = nome");
connection.commit();
connection.close();
conexao_aberta = false;
statement.close();
resp=resp.concat("Conexão FECHADA\n");
}
catch (SQLException sqlException)
{
resp=resp.concat("Conexão NÃO pode ser fechada\n");
}
}
else
{
resp=resp.concat("Conexão JÁ se encontra fechada\n");
}
//
return resp;
}
public boolean Conexao_Aberta()
{
return conexao_aberta;
}
}
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/04/2009 07:18:29
|
luis.soares
JavaEvangelist
![[Avatar]](/images/avatar/4b880d619bbbcbbea22b13bfa30a1ace.png)
Membro desde: 01/08/2006 09:48:47
Mensagens: 310
Localização: São Paulo
Offline
|
osvaldol, sei que é novo por aqui. Então peço que leia este tópico http://www.guj.com.br/posts/list/50115.java que trata de algumas regras para postagem de tópicos. No seu caso seu código ficou sem formatação, fica difícil ler assim...
Estou postando seu código formatado aqui abaixo :
Sua classe Importacao:
Sua classe Conexao1:
Pronto.
Agora meu amigo, você precisa colocar o stack trace completo do erro que vc está tendo, para que possamos lhe ajudar.
Leia o tópico que te passei no início deste menagem para formatar corretamente o código.
Depois disso vamos te ajudando.
Valeu !
|
Luis Soares
Analista Desenvolvedor Java
luishsoares@gmail.com
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/04/2009 18:46:11
|
osvaldol
Smalltalk
Membro desde: 13/04/2009 20:56:33
Mensagens: 4
Offline
|
Caro Luis,
Realmente sou novato, tando no forum como em programação Java. Portanto gostaria de mais algumas informações. Não consigo
formatar meu código da maneira que você formatou, mesmo já tendo tentado várias vezes. O que significa " stack trace "? Procurei a
tradução, mas não me trouxe nenhum esclarecimento. Tá vendo, sou novato mesmo.
Grato.
Osvaldo
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/04/2009 02:21:06
|
osvaldol
Smalltalk
Membro desde: 13/04/2009 20:56:33
Mensagens: 4
Offline
|
Consegui Importar o arquivo, mas demorou 8 minutos para importar um arquivo de 15.000 linhas. Esta demora é normal no Java. Usando o VB a importaçao do mesmo arquivo não passa de 10 segundos. Perguntas: Existe alguma API no Java para importação
mais rápida? Poderia ser utilizada Coleções "ArrayList, Map etc.."?? grato
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/04/2009 08:16:30
|
luis.soares
JavaEvangelist
![[Avatar]](/images/avatar/4b880d619bbbcbbea22b13bfa30a1ace.png)
Membro desde: 01/08/2006 09:48:47
Mensagens: 310
Localização: São Paulo
Offline
|
Osvaldo, quanto à formatação do código, basta que vc inclua o seu código entre as tags .
Sobre stackTrace, veja : http://en.wikipedia.org/wiki/Stack_trace. Em resumo é o registro das chamadas de métodos e recursos que antecederam a ocorrência de determinado erro (embora possamos obter o stack trace independente de ocorrência de erro). Com ele fica mais fácil identificarmos em qual linha ocorreu o erro e os seus indícios.
Sobre a demora na execução do código, ela não é normal. Um ponto fundamental analisando superficialmente seu código é que você não usou preparedStatements para as operações de inclusão no banco de dados. Isto impacta negativamente e muito na performance.
Leia sobre preparedStatements, e implemente no seu código. Com certeza haverá melhora sensível. Veja : http://java.sun.com/docs/books/tutorial/jdbc/basics/prepared.html
Bom trabalho
|
Luis Soares
Analista Desenvolvedor Java
luishsoares@gmail.com
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/04/2009 19:59:46
|
osvaldol
Smalltalk
Membro desde: 13/04/2009 20:56:33
Mensagens: 4
Offline
|
Luis,
Desculpe-me, mas não consegui formatar ainda. No cabecalho vejo os seguintes botões:
B* I* _u Quote Code* List Img URL Google ...
Em qual deles devo clicar para que formatar meu código?
Quanto a demora na importação do arquivo, foi feita da seguinte forma:
a) Faço a conexao com o BD da seguinte forma, criando um psstatemente:
public String Abre_Conexao()
{
String resp="";
try
{
// cria a conexao
connection = DriverManager.getConnection(caminho,"osvaldo@%","140568");
connection.setAutoCommit(true);
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
connection.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
// cria Statement para consultar banco de dados
statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE,ResultSet.HOLD_CURSORS_OVER_COMMIT);
// consulta o banco de dados
Pstatement = connection.prepareStatement("INSERT INTO tblDsr733 agencia,conta,documento,valor,banco,lote,sequencial,motivo)VALUES (?, ?, ?, ?, ?, ?, ?,?)");
Pstatement1 = connection.prepareStatement("select codigo, agencia,conta,documento,valor,banco,lote,sequencial,motivo from tblDsr733",ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = Pstatement1.executeQuery();
rs.next();
//
resp=resp.concat("Conexão ABERTA\n");
conexao_aberta = true;
}
catch (SQLException sqlException)
{
resp=resp.concat("Conexão NÃO estabelecida\n");
}
//
return resp;
}
a) Um botão em form principal chama a função importa, passando a conexao ja´realizada:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
importac.importa(conexao);
}
b) Eis minha função importa dentro da classe Importac que depois de obter os dados contidos em cada linha
do arquivo chama a função Inserir_BD passando esses dados como parâmetros:
public void importa(Conexao con){
try{
reader = new FileReader(file);
bufReader = new BufferedReader(reader);
while (linha!=null) {
linha = bufReader.readLine();
if (linha.charAt(32)!= ' ' )
{
agencia = linha.substring(3, 7);
conta = linha.substring(7, 16);
documento = linha.substring(19, 23);
valor = linha.substring(24, 34);
banco = linha.substring(40,42);
lote = linha.substring(41,4 ;
sequencial = linha.substring(48, 51);
motivo = linha.substring(51, 53);
cheque_DSR = new Cheque_DSR(agencia, conta, documento, valor, banco, lote, sequencial, motivo);
con.Inserir_BD(agencia, conta, documento, valor, banco, lote, sequencial, motivo);
}
if (linha!=null) {
sb.append( linha + "\r\n" );
}
}
bufReader.close();
reader.close();
con.Fecha_Conexao();
}
catch (IOException e) {
e.printStackTrace();
}
catch (NullPointerException e) {
e.printStackTrace();
}
}
}
c) E por fim minha função Inserir_BD dentro da classe Conexao:
public void Inserir_BD(String agencia, String conta, String documento, String valor, String banco, String lote, String sequencial, String motivo){
try{
Pstatement.setString(1,agencia);
Pstatement.setString(2,conta);
Pstatement.setString(3,documento);
Pstatement.setString(4,valor);
Pstatement.setString(5,banco);
Pstatement.setString(6,lote);
Pstatement.setString(7,sequencial);
Pstatement.setString(8,motivo);
row = Pstatement.executeUpdate();
}
catch (SQLException sqlException)
{
JOptionPane.showMessageDialog(null,"Erro na query","Proximo",JOptionPane.ERROR_MESSAGE);
}
}
Você pode observar que obtenho as informação em cada linha do arquivo utilizando "SUBSTRING". Não será aí que está o motivo
da demora na importação?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/04/2009 20:05:27
|
Filipe A.
JavaTeenager
![[Avatar]](/images/avatar/f2e97d0ce7967d4da366704b14b3922b.jpg)
Membro desde: 15/03/2009 18:41:51
Mensagens: 172
Localização: Pres - Prudente SP
Offline
|
É o Code.
Coloque um antes e um depois do seu codigo.
|
|
|
 |
|
|
|
|