Inserir Dados de um TXT No banco de dados (Access)

14 respostas
brunosardao

Galera,

Estou fazendo a leitura de um arquivo TXT e pretendo salvar estes dados no Banco de Dados Access.

Porém acredito estar fazendo alguma besteira.

public class BD {

    public Connection con;
    public Statement stm;
    
    public void conectar(){
        
        try
		{
			/* Tenta se conectar ao Driver */
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		}
		catch (ClassNotFoundException e)
		{
			JOptionPane.showMessageDialog(null, "Impossível carregar o Driver.");
			System.exit(0);
		}
		try
		{
			/* nomedobanco é o nome que você deu anteriormente ao seu alias */
			con = DriverManager.getConnection("jdbc:odbc:BD_ArqTexto","","");
			stm = con.createStatement();
		}
		catch (SQLException sqle)
		{
			JOptionPane.showMessageDialog(null, "Problema ao conectar!");
			System.exit(0);
		}

		JOptionPane.showMessageDialog(null, "Conectado com sucesso!");
                
  	}

    
    public void Desconectar(){
        
		try
		{
			con.close();
		}
		catch (SQLException sqle)
		{
			JOptionPane.showMessageDialog(null, "Problema ao desconectar!");
			System.exit(0);
		}
	   }

    
    
    public void Processamento() throws SQLException{
        
    String leitor = null;
			
	  	try{ 	 
		    		 
                 FileInputStream stream = new FileInputStream("C://ARQ_texto/Log/Log_ControlM_1.txt");     
		   InputStreamReader streamReader = new InputStreamReader(stream);     
		   BufferedReader reader = new BufferedReader(streamReader);     

                      while( (leitor=reader.readLine() ) != null ) {     

                           if (leitor.contains("ABENDED")){

		                  String arquivoAbend = leitor;
		                  String[] novoArq = arquivoAbend.split(" ");
		                
                                  String data       = novoArq[2];   
                                  String hora       = novoArq[3];
                                  String odate      = novoArq[4];
                                  String job        = novoArq[13].substring(0,8);
                                  String job_ID     = novoArq[13].split("/")[1];
                                  String Ocorrencia = novoArq[15];
                                  
                                  
                     // SQL de Inserção no banco
                                  
                                  
                         String query = "INSERT INTO ERROS(Data,Hora,Odate,Job,job_ID,Ocorrencia)VALUES(?,?,?,?,?,?)";
                         PreparedStatement stmt = con.prepareStatement(query);
                         
                         stmt.setString(1, data);
                         stmt.setString(2, hora);
                         stmt.setString(3, odate);
                         stmt.setString(4, job);
                         stmt.setString(5, job_ID);
                         stmt.setString(6, Ocorrencia);
                         
                         stmt.execute();
                         stmt.close();
	                     }
                         }   
                           JOptionPane.showMessageDialog(null, "Dados Inseridos");

		            reader.close();       
		            streamReader.close();     
		            stream.close(); 
 
                      }catch(IOException e){
		           System.out.println(e.getMessage());
		  	
	              }	
		   }
               }

O meu arquivo é separado por espaço, então criei um array de string conforme acima para pegar os campos

E usei os indices deste array para adicionar as informações em variaveis e preciso pegar estes valores para adicionar no banco de dados. Mas não estou conseguindo.

O que estou fazendo de errado ?

Obrigado,

14 Respostas

brunosardao

Esqueci de comentar:

Estou executando este processo atráves de um projeto java Swing.

Então estou instanciando os métodos da minha classe no botão conforme abaixo:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    
        BD novo = new BD();
      
        novo.conectar();
        try {
            novo.Processamento();
        } catch (SQLException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }
        novo.Desconectar();

        
    }

Mas, depois de executar o processo, as informações até chegam a ser inseridas no banco, porém ocorre a mensagem abaixo:

GRAVE: null

java.sql.SQLException: General error

at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6986)

at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114)

at sun.jdbc.odbc.JdbcOdbc.SQLExecute(JdbcOdbc.java:3149)

at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(JdbcOdbcPreparedStatement.java:216)

at ProcessoArqTexto.BD.Processamento(BD.java:103)

at ProcessoArqTexto.Principal.jButton1ActionPerformed(Principal.java:99)

at ProcessoArqTexto.Principal.access$000(Principal.java:21)

at ProcessoArqTexto.Principal$1.actionPerformed(Principal.java:50)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)

at java.awt.Component.processMouseEvent(Component.java:6288)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)

at java.awt.Component.processEvent(Component.java:6053)

at java.awt.Container.processEvent(Container.java:2041)

at java.awt.Component.dispatchEventImpl(Component.java:4651)

at java.awt.Container.dispatchEventImpl(Container.java:2099)

at java.awt.Component.dispatchEvent(Component.java:4481)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)

at java.awt.Container.dispatchEventImpl(Container.java:2085)

at java.awt.Window.dispatchEventImpl(Window.java:2478)

at java.awt.Component.dispatchEvent(Component.java:4481)

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)

at java.awt.EventQueue.access$000(EventQueue.java:84)

at java.awt.EventQueue$1.run(EventQueue.java:602)

at java.awt.EventQueue$1.run(EventQueue.java:600)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)

at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)

at java.awt.EventQueue$2.run(EventQueue.java:616)

at java.awt.EventQueue$2.run(EventQueue.java:614)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

O que estou fazendo de errado ? ou o que pode estar errado ?

mais uma vez obrigado,

ViniGodoy

Todos os campos do seu banco são mesmo Strings?

brunosardao

Vini,

No meu banco de dados, todas as informações, eu deixei como String, mesmo os campos que contém números que são (DATA, ODATE e JOB_ID).

Obrigado,

V

tente usar o MySQL, é bem melhor

brunosardao

Então,

Com certeza o MYSQL é bem melhor, mas é que não vou ficar armazenando sempre dados neste banco de dados, preciso carregá-los para poder trabalhar com algumas informações e depois eliminar elas do banco…

e não são muitas informações, por isso que achei melhor usar o ACCESS…

E será que vc ou alguém conseguiu entender a mensagem de erro que ocorre quando executo meu programa ? não entendi o que ocorre…e mesmo assim, ele adiciona as informações…

valeu

V

Você tem alguma classe beans?

brunosardao

Não, não tenho nenhuma classe beans…

não sei como utilizar esta classe…

brunosardao

Galera,

Resolvi, removi a mensagem da exceção que estava na minha main e não ocorreu mais o erro, pois os dados estão sendo inseridos corretamente.

Obrigado,

brunosardao

Galera,

tenho duas dúvidas agora:

Em uma determinada coluna, eu tenho que obter um registro de 8 posições : “novoArq[13].substring(0,8)”, porém esta ocorrendo o erro de “java.lang.StringIndexOutOfBoundsException: String index out of range: 8”, isso por que quando fiz o debug, descobri que tem registros que não possui esta quantidade.

o que posso fazer para não pegar estes registros menores que 8 ?

E estou fazendo uma aplicação em Swing. Como posso fazer para que as mensagens do meu programa no caso as etapas sejam mostradas em um JTextField: Exemplo:

Conectando no banco de Dados…
Conectado.
Processando informações…
Processado.
Fechando o banco de dados…
Fechado.
Arquivo salvo na pasta …

Mais uma vez, obrigado a todos pelos auxilios prestados…

jokacwb

Para evitar o “String index out of range”, vc pode, antes, verificar o tamanho da string, usando o length(), e assim vc pode gerenciar melhor o substring

int tamanho = novoArq[13].length();

System.out.println(novoArq[13].substring(0, tamanho));

ou seja o segundo parâmetro do subString nunca poderá ser maior que o tamanho total da String.

Na parte do Swing não vou poder t ajudar.

Rodrigo_Sasaki

jokacwb:
Para evitar o “String index out of range”, vc pode, antes, verificar o tamanho da string, usando o length(), e assim vc pode gerenciar melhor o substring

int tamanho = novoArq[13].length();

System.out.println(novoArq[13].substring(0, tamanho));

ou seja o segundo parâmetro do subString nunca poderá ser maior que o tamanho total da String.

Na parte do Swing não vou poder t ajudar.

só faltou um detalhe, pra pegar o tamanho correto tem que fazer assim

int tamanho = novoArq[13].length()-1;

se tem dúvida quanto ao -1… é o seguinte…

o método length() retorna o tamanho da string.
agora o método substring() recebe como último parâmetro a posição do caracter em que ele deve parar…

e como o Java começa a contar a partir do 0… 8 posições seriam de 0 até 7
ou seja, length()-1

abraço!

jokacwb

digaoneves, permita-me discordar, na documentação diz:

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#substring%28int,%20int%29

fiz um teste básico, só rodar e conferir:

String str = "12345678";
		
		System.out.println(str.substring(0,str.length()));     //Como eu sugeri
		System.out.println(str.substring(0,str.length()-1));  //Sua sugestão usando o -1
brunosardao

digaoneves e jokacwb

Obrigado aos dois pelo help…

Vou testar em meu programa e depois posto o resultado…

valeu…

Rodrigo_Sasaki

realmente jokacwb, me desculpem aí pessoal, me equivoquei um pouco na hora do post, sigam as instruções do nosso amigo aí acima

desculpe aí amigo e obrigado pela correção, sempre aprendendo… hehe

abraço!

Criado 15 de maio de 2011
Ultima resposta 18 de mai. de 2011
Respostas 14
Participantes 5