Erro ao inserir dados com odbc Acess

44 respostas
C
Criei uma classe para receber os meus valores de tela e atualizar uma base de dados acess, mas esta ocorrendo o seguinte erro:

[color=red] -------CLASSE -----[/color]import [color=green[color=green]][color=darkred]java.sql.BatchUpdateException;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Statement;

public class CriaRegistros {

[color=red][color=darkred]/** parametros de tela */[/color][/color]	

public void atualizaBase(String cod,

String nome,

String email,

String fone){
//PrepareStatement ps = null;
	String url = "jdbc:odbc:dbsample";
	Connection con;
	Statement stmt;
	try {
		Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		
	}catch (ClassNotFoundException e) {
		System.err.print("ClassNotFoundException: ");
		System.err.print(e.getMessage());
		
		
	}
	try{
		con = DriverManager.getConnection(url, "user", "password");
		con.setAutoCommit(false);
		stmt = con.createStatement();
		String query = "INSERT INTO Funcionario" + " VALUES(" + cod +  ", " + nome +  ", " + email + ", " + fone + ")";
		//stmt.addBatch(query);
		stmt.executeUpdate(query);
		con.commit();
		con.setAutoCommit(true);
		stmt.close();
		con.close();
		
	} catch(BatchUpdateException b){
		System.err.println("----- BatchUpdateException ---- ");
		System.err.println("SQLState: " + b.getSQLState());
		System.err.println("Message : " + b.getMessage());
		System.err.println("Vendor  : " + b.getErrorCode());
		System.err.print("Update counts  : ");
		int [] updateCounts = b.getUpdateCounts();
		for (int i = 0; i < updateCounts.length; i++ ){
			System.err.print(updateCounts[i] + "   ");
		}
		System.err.println("   ");
		
	} catch(SQLException ex){
		System.err.println("----- SQLException ---- ");
		System.err.println("SQLState: " + ex.getSQLState());
		System.err.println("Message : " + ex.getMessage());
		System.err.println("Vendor  : " + ex.getErrorCode());
		
	}
	
}

}[/color][/color][/color]

[color=red][color=orange]
Erro retorna do console do eclipse[/color][/color]

[color=orange]----- SQLException ----
SQLState: 37000
Message : [Microsoft][Driver ODBC para Microsoft Access] Erro de sintaxe (operador faltando) na expressão de consulta ‘Carlos valentini’.
Vendor : -3100[/color]

44 Respostas

maquiavelbona

Bom dia,

creio que seu problema reside na construção da expressão SQL.

Em uma hipótese, a expressão que estás a passar é algo parecido com isso:

INSERT INTO Funcionario VALUES( 012011 , Soren Kieerkegaard , [email removido] , [telefone removido]);

Ele dará um erro logo no primeiro espaço dentro de uma string passada ao Access pois ele não tem como reconhecer quando começa ou termina a string.

Uma maneira de resolver isso é delimitar cada string. Exemplo:

INSERT INTO Funcionario VALUES( ‘012011’ , ‘Soren Kieerkegaard’ , ‘[email removido]’ , ‘[telefone removido]’);

Em seu código ficaria algo:

String query = “INSERT INTO Funcionario” + " VALUES(’" + cod + “’, '” + nome + “’, '” + email + “’, '” + fone + “’)”;

Talvez seja isso, não tenho como testar aqui então não posso ajudar melhor. Até mais!

C

Valeu era isso mesmo.
Funcional!!!

Consegui! Para a minha aplicação ficar 10 falta agora exibir os registros na JTable tenho 5 registros e ele mostra só o último mas isso é questão

De fazer alguns acertos.

maquiavelbona

Beleza. Qualquer coisa estamos aí!

C
Conheçe algo de JTable?

Consegui cadastar 5 registros mas somente mostra o último.

Segue fonte;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import javax.swing.JButton;
import javax.swing.JTable;

public class FrameC extends javax.swing.JFrame {

public JButton bt_cancelar = new JButton(Fechar);

public JButton bt_eliminar = new JButton(Eliminar);

private javax.swing.JPanel bAdd;

private javax.swing.JPanel pnTable;

private javax.swing.JScrollPane scrollTable;

private javax.swing.JTable table;

String url = jdbc:odbc:dbsample;

Connection con;

Statement stmt;
private static final long serialVersionUID = 1L;


public FrameC() {
	try {
		initComponents();
	} catch(Exception ex) {
		ex.printStackTrace();
	}
}
private JTable initComponents() throws Exception {

bAdd = new javax.swing.JPanel();

pnTable = new javax.swing.JPanel();

scrollTable = new javax.swing.JScrollPane();

table = new javax.swing.JTable();
setTitle("Consulta Funcionários");
    addWindowListener(new java.awt.event.WindowAdapter() {
        public void windowClosing(java.awt.event.WindowEvent evt) {
            
        }
    });

    bAdd.setLayout(null);

    pnTable.setLayout(new java.awt.GridLayout(1, 0));

    pnTable.setBorder(new javax.swing.border.TitledBorder("Funcionários"));
    
        try {
        		Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        		
        	}catch (ClassNotFoundException e) {
        		System.err.print("ClassNotFoundException: ");
        		System.err.print(e.getMessage());
        		
        		
        	}
        	
        	try {
        		con = DriverManager.getConnection(url, "user", "password");
        		stmt = con.createStatement();
        				
        	}catch(SQLException ex){
        		System.err.print("SQLException: " + ex.getMessage());
        	}
        
        	ResultSet uprs = stmt.executeQuery("SELECT * FROM Funcionario");
        	
        	while (uprs.next()){
        		String cod   = uprs.getString("COD_FUNC");
        		String nome  = uprs.getString("NOME_FUNC");
        	    String email = uprs.getString("EMAIL");
        	    String fone  = uprs.getString("NUM_FONE");
        	    table.setModel(new javax.swing.table.DefaultTableModel(new Object [][] { },new String []{"Código","Nome","E-Mail","Telefone"}));
        	    javax.swing.table.DefaultTableModel modelo = (javax.swing.table.DefaultTableModel)table.getModel();   
        	    modelo.addRow(new Object[]{cod, nome, email,fone});
        	    System.out.println(nome);
        	    table = new JTable(modelo);
        	    
        	    
                        	           	    
        	}    
        	  
        	    
       	
   
scrollTable.setViewportView(table);
pnTable.add(scrollTable);
bAdd.add(pnTable);
pnTable.setBounds(10, 10, 370, 230);
bAdd.add(bt_cancelar);
bt_cancelar.setBounds(380, 215, 80, 23);
getContentPane().add(bAdd, java.awt.BorderLayout.CENTER);
bAdd.add(bt_eliminar);
bt_eliminar.setBounds(380, 180, 80, 23);


java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-474)/2, (screenSize.height-283)/2, 474, 283);
    
bt_cancelar.addActionListener(new EventosControlFrameC(this));
return table;

}

}

maquiavelbona

Opa,

Conheco algo de Swing então vou tentar ajudá-lo.

Quando você muda o modelo da tabela(Model), você por consequencia perde todas as informações que estavam no modelo anterior. Então quando você coloca :

table.setModel(new javax.swing.table.DefaultTableModel(new Object [][] { },new String []{"Código","Nome","E-Mail","Telefone"})); 
javax.swing.table.DefaultTableModel modelo = (javax.swing.table.DefaultTableModel)table.getModel();

, no meio do seu loop de gravação das linhas de detalhe, você acaba perdendo todas as informações dos registros anteriores. Uma maneira fácil de mudar isso é simplesmente colocar o Model fora do loop, evitando assim que se perca as informações. Outro problema que eu encontrei foi que você cria a todo passo de loop uma tabela nova, fazendo que a tabela anterior contendo os registros anteriores sejam perdidos, como segue abaixo:

while (uprs.next()){ 
...

table = new JTable(modelo); 
}
...

, então novamente colocando fora do loop, você poderá evitar perda de dados fundamentais. Agora segue o código modificado na qual em tese deveria funcionar:

ResultSet uprs = stmt.executeQuery("SELECT * FROM Funcionario"); 

table.setModel(new javax.swing.table.DefaultTableModel(new Object [][] { },new String []{"Código","Nome","E-Mail","Telefone"})); 
javax.swing.table.DefaultTableModel modelo = (javax.swing.table.DefaultTableModel) table.getModel(); 

while (uprs.next()){ 
  String cod = uprs.getString("COD_FUNC"); 
  String nome = uprs.getString("NOME_FUNC"); 
  String email = uprs.getString("EMAIL"); 
  String fone = uprs.getString("NUM_FONE"); 
  modelo.addRow(new Object[]{cod, nome, email,fone}); 
  System.out.println(nome); 
} 
table = new JTable(modelo);

Obs.: Evite de colocar inicialização de um objeto fora de um loop e sua construção dentro de um loop. Pode-se confundir facilmente e depois para achar qual é o erro é meio complicado.
Com essas alterações, possivelmente seu problema será resolvido. Qualquer coisa, volte a postar nesse tópico.

Abraços!

C

Valeu funcionou que uma blz.

maquiavelbona

Maravilha! Quaisquer outras dúvidas, não hesite em perguntar. :slight_smile:

C

Como eu capturo o valor de uma celula da Jtable
Tipo quero pegar o valor do campo Código da celula corrente.
Para pegar a linha é table.getSelectedRows() e a coluna table.getSelectedColumns(), com este valores como eu pego um valar que esta na celula 1 da coluna 1???

maquiavelbona

Você consegue pegar um valor em específico em uma JTable pelo código abaixo:

table.getValueAt(int linhaTable, int colunaTable);

No seu caso ficaria algo assim:

table.getValueAt(table.getSelectedRow(),table.getSelectedColumn());

, mas se e somente se você permitir que uma coluna em específico seja selecionada, caso contrário, você possivelmente vai receber um NullPointerException.

No seu caso, eu creio que seja mais adequado:

table.getValueAt(table.getSelectedRow(),0);

Assim você garante que pega o primeiro valor da linha em questão.

Até mais!

V

Valeu erra isso mesmo, com base nisso vou fazer o delete no jdbc, além de eliminar a minha no JTable

maquiavelbona

Certinho. Boa sorte aí programando.

C
Tenho mais uma duvida se puder me ajudar:

Tenho um programa que faz acesso a uma base acess via jdbc, em tela tenho quatro botões, para efetuar a navegação nos registros:

Tipo :

<< < > >>

First Prev Next Last

Como eu faço para criar, os comandos SQL e passar via string para o ResultSet???

Alguém poderia me passar um exemplo da sintase destes comandos.

Ou posso utilizar os comando first(),previus(),next() e last().

E por exemplo se eu utitilizar estes comandos e for para o último registro e ao clicar no botão prev o resultSet vai conseguir se posicionar no registro anterior???

Eu fiz o seguinte:

Fiz o seguinte

String url = jdbc:odbc:dbsample;

Connection con;

Statement stmt;

String msg;

try {
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);

}catch (ClassNotFoundException e) {

System.err.print("ClassNotFoundException: ");
System.err.print(e.getMessage());

}

try {
con = DriverManager.getConnection(url, “user”, “password”); stmt = con.createStatement();

}catch(SQLException ex){

msg=ex.getMessage();
JOptionPane.showMessageDialog(null,msg,“Erro”,JOptionPane.ERROR_MESSAGE);

}

ResultSet uprs = stmt.executeQuery(SELECT * FROM Departamento);

/*** Aqui carrega os campos de tela com o valor do primeiro registro ***/

while (uprs.first()){

this.JTextField1.setText(uprs.getString(COD_DEPTO));

this.JTextField2.setText(uprs.getString(DESC_DEPTO));

}
E aparece o seguinte erro de SQL:

java.sql.SQLException: Result set type is TYPE_FORWARD_ONLY

at sun.jdbc.odbc.JdbcOdbcResultSet.first(Unknown Source)

Mudei para

while (uprs.next()){

this.JTextField1.setText(uprs.getString(COD_DEPTO));

this.JTextField2.setText(uprs.getString(DESC_DEPTO));

break;

ai funcionol tráz o primeiro registro quando carrego a tela, mas ai vem a outra parte do meu problema, tenho os botões em tela << < > >>, para que o usuário possa navegar para frente e para trás nos registros e ai os comandos first(), previus(), next() e last() vão funcionar???

maquiavelbona

Bom dia!

Desculpe a demora para responder, estava meio ocupado aqui no trabalho.

Quando você se utiliza do método createStatement() do objeto con, você usa os valores padrão TYPE_FORWARD_ONLY(ou seja, somente observa as linhas retornadas de maneira linear e sempre para frente) e CONCUR_READ_ONLY (ou seja, os registros não podem ser atualizados por essa conexão). Para que se possa movimentar livremente pelo ResultSet, terás que usar um método parecido do objeto con, que é o

createStatement(int resultSetType, int resultSetConcurrency)

que tem o mesmo nome, mas argumentos diferentes. Um exemplo simples e funcional seria você criar assim:

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

Aí você consegue percorrer o ResultSet utilizando os métodos first(), next(), previous() e last();

Caso queira saber um pouco mais sobre isso, leia a API referente a essa classe em : http://java.sun.com/j2se/1.4.2/docs/api/java/sql/ResultSet.html

Abraços!

C
Ultima pergunta eu prometo.

Estou trabalhando na cosntrução de uma treeTable.

Na arvore quero mostrar como pai o Departamento e os filhos os funcionários olhei alguns exemplo na internet,  que ,e deparei com uma duvida eu criei um método.

public static Object[] getTree() throws Exception {

try {

Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
}catch (ClassNotFoundException e) {
		System.err.print("ClassNotFoundException: ");
		System.err.print(e.getMessage());
		
		
	}
	
	try {
		con = DriverManager.getConnection(url, "user", "password"); //"user"
		stmt = con.createStatement();
				
	}catch(SQLException ex){
		  msg=ex.getMessage();
          JOptionPane.showMessageDialog(null,msg,"Erro",JOptionPane.ERROR_MESSAGE);
            
          
	}

	ResultSet uprs = stmt.executeQuery("SELECT * FROM Departamento");
	
	while (uprs.next()){
		  
	  String cod = uprs.getString("COD_DEPTO");
	   
	      	 
	 } 
	return parent;
}

Mas o retorno tem que ser um objeto como eu transformo o valor capturado do banco atraves do RecordSet para objeto???
Tem algum endereço na net que tenho um exemplo bem prático deste componente???

maquiavelbona

Boa tarde. Não se preocupe em perguntar e sim em ficar com dúvidas.

Nunca trabalhei com TreeTable então não consigo ajudá-lo muito nesse caso, mas no de retornar um array de objetos isso eu posso.

Utilizando a classe ArrayList, encontrará um método chamado toArray() que retorna todos os valores armazenados ali como um único array de objetos. Segue o exemplo usando o seu código:
public static Object[] getTree() throws Exception { 

ArrayList valores = new ArrayList();

try { 
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 

}catch (ClassNotFoundException e) { 
System.err.print("ClassNotFoundException: "); 
System.err.print(e.getMessage()); 


} 

try { 
con = DriverManager.getConnection(url, "user", "password"); //"user" 
stmt = con.createStatement(); 

}catch(SQLException ex){ 
msg=ex.getMessage(); 
JOptionPane.showMessageDialog(null,msg,"Erro",JOptionPane.ERROR_MESSAGE); 


} 

ResultSet uprs = stmt.executeQuery("SELECT * FROM Departamento"); 

while (uprs.next()){ 

valores.add(uprs.getString("COD_DEPTO")); 


} 
return valores.toArray(); 
}

Se for esse realmente o problema, acho que podes usar esse exemplo.

Até mais!

C
Ocorre um erro:

No data found

at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)

at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(Unknown Source)

at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Unknown Source)

at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)

at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)

at CriaTree.getTree(CriaTree.java:62)

Alinha 62 é justamente : valores.add(uprs.getString(“COD_DEPTO”));
O que eu posso estar fazendo de errado???

C

Agora funcionol, mais uma coisa como eu recuoero o valor gravado neste array, por exemplo com a linha
while (uprs.next()){

cod = uprs.getString("COD_DEPTO");
	   
	   valores.add(cod ); 
	   
	      	 
	 }

Eu gravei na posição [1] do array o valor 01 do banco, como eu posso recuperar este valor para mostrar me tela???
E se na posição eu gravar assim 01+Fundição (codigo e descrição como eu faço para recuperar e separar os valores???

maquiavelbona

Não entendi, teria como ser mais claro na sua dúvida?

C

Eu estou gardadno os valores gravados em um array de objetos.
Na intrface vou ter que exibir estas informações me tela.
Em cada posição do array eu gravo array[1] = codigo+descrição;
Do outro lado tenho que ler este array e mostrar por exemplo que na posição array[1] esta gravado 01 - fundição, pois cada objeto gravado no array é um no da arvore.
Como eu faço isso recuperar o valor (String) que eu gravei?

C
Para ficar mais claro o que preciso fazer  vou detalhar:

) na classe que busca as informações no banco faço o seguinte:

try {

Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);

con = DriverManager.getConnection(url, “user”, “password”); //“user”

stmt = con.createStatement();
ResultSet uprs = stmt.executeQuery("SELECT * FROM Funcionario" + " where COD_DEPTO = '" + cod + "'");
		
    	while (uprs.next()){
    		  
    		   String codigo = uprs.getString("COD_FUNC"); 
        	   String nome = uprs.getString("NOME_FUNC"); 
        	   String email = uprs.getString("EMAIL"); 
       	       String fone = uprs.getString("NUM_FONE"); 
       	       valores.add(codigo + "," + nome + "," +  email + "," +  fone); 
       	    
				
    	      	 
    	 } 
	    
	} catch (SecurityException se) {} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
Aqui gravo no ArrayList os valores encontrados
	return valores.toArray(); 
}

na Classe que vai exibir as informações me tela:
Como ela é extends AbstractTreeTableModel implements TreeTableModel
Tem alguns metodos padrões:

public int getColumnCount() {

// TODO Auto-generated method stub

return 0;

}
public String getColumnName(int column) {
	// TODO Auto-generated method stub
	return null;
}

public Object getValueAt(Object node, int column) {
	// TODO Auto-generated method stub
	return null;
}

public Object getChild(Object arg0, int arg1) {
	// TODO Auto-generated method stub
	return null;
}

public int getChildCount(Object arg0) {
	// TODO Auto-generated method stub
	return 0;
}

e no método getValueAt é que vou exibir o valores em tela.
e no objeto vai por exemplo ter quardado os valores da tabela que quero exibir em tela
Como eu faço para extrair estes valores " codigo + “,” + nome + “,” + email + “,” + fone); "
Obrigado.

maquiavelbona

Bom dia,

se o seu método getValueAt(Object node, int column) receber simplemente uma linha da array de objetos criada anteriormente, ficaria algo assim:

public Object getValueAt(Object node, int column) {
	String[] stripedString = ((String)node).split(","); // sim eu sei que o nome da variável é péssimo mas é legal
	return stripedString[column];
}

Assim ele lhe retornaria o valor da coluna na linha que você forneceu. Isso resolveu sua dúvida? Eu nunca usei esse TreeTableModel da jDesktop.

Até mais!

C
Esta dano o seguinte problema quando busco as infrmações:

public Object getValueAt(Object node, int column) {

// TODO Auto-generated method stub

Object tree = getFile(node);

System.out.println(Valor de tree: " + tree);

String[] stripedString = ((String)tree).split(”,");

System.out.println("Valor stripedString: " + stripedString);

try {
switch(column) {
	    case 0:
		return stripedString[column];
	    case 1:
		return stripedString[column];
	    case 2:
		return stripedString[column];
	    case 3:
		return stripedString[column];
	    }
	}
	catch  (SecurityException se) { }
	return null;


	
}
Valor de tree: [Ljava.lang.Object;@169e11Exception in thread AWT-EventQueue-0 java.lang.ClassCastException: [Ljava.lang.Object;

at FileSystemModel.getValueAt(FileSystemModel.java:66)

at TreeTableModelAdapter.getValueAt(TreeTableModelAdapter.java:67)

at javax.swing.JTable.getValueAt(Unknown Source)

at javax.swing.JTable.prepareRenderer(Unknown Source)

at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)

at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)

at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)

at javax.swing.plaf.ComponentUI.update(Unknown Source)

at javax.swing.JComponent.paintComponent(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at javax.swing.JComponent.paintChildren(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at javax.swing.JViewport.paint(Unknown Source)

at javax.swing.JComponent.paintChildren(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at javax.swing.JComponent.paintChildren(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at javax.swing.JComponent.paintChildren(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at javax.swing.JComponent.paintChildren(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at javax.swing.JLayeredPane.paint(Unknown Source)

at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at sun.awt.RepaintArea.paintComponent(Unknown Source)
at sun.awt.RepaintArea.paint(Unknown Source)
at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
maquiavelbona

Você poderia compartilhar seu código-fonte para que eu possa ver o que realmente está dando problema? Pois o problema está no objeto “tree” e não sei qual eh realmente o seu formato para poder te ajudar melhor.

Até mais

C
Bom dia.

Não mandei os fontes pois resolvi fazer uam revolução no meu código e parece estar dando certo  apreceu uma pequena dúvida do modo como esta abaixo funciona:

Account account1 = new Account(Yahoo, POP3/SMTP);

account1.addEmailAddress(<a>"[email removido]</a>");

account1.addEmailAddress(<a>"[email removido]</a>");
Account account2 = new Account(EDS, POP3/SMTP);

account2.addEmailAddress(<a>"[email removido]</a>");

account2.addEmailAddress(<a>"[email removido]</a>");
Account account3 = new Account(NOFFCROFF, POP3/SMTP);

account3.addEmailAddress(<a>"[email removido]</a>");

account3.addEmailAddress(<a>"[email removido]</a>");

account3.addEmailAddress(<a>"[email removido]</a>");

account3.addEmailAddress(<a>"[email removido]</a>") ;

O numero esta fixo ccount1, ccount2 e ccount3, mas e se eu não souber o numero de contas que estiver lendo, vamos dizer que eu esteja lendo meu banco de dados, e pode ter uma numero muito grande registros,

ccount1N como eu faço???
maquiavelbona

Seria algo assim? Vou tentar colocar um exemplo:

List accList = new ArrayList();
while(rsAccounts.next()){
 Account tmpAccount = new Account(rsAccounts.getString(1), rsAccounts.getString(2));
 String str = "select * from emails where provider ='"+rsAccounts.getString(1)+"'";
 stmt2 = con.createStatement(); 
 ResultSet rsEmails= stmt2.executeQuery(str);
 while(rsEmails.next()){
  tmpAccount.addEmailAddress(rsEmails.getString(2));
 }
 accList.add(tmpAccount);
}

Ao fim desse código, você irá ter um ArrayList com os Accounts dentro e cada account terá os seus respectivos emails. Para recuperar cada account, você poderá usar tanto o método get(int indice) ou se quiser que ele percorra toda a lista poderá fazer o seguinte:

// Pegando cada Account
Iterator it = accList.iterator();
while (it.hasNext()) {
    Account element = (Account) it.next();
    System.out.println(element);
}

Aí eu não como está fazendo para recuperar o email, mas acho que assim já dá para o senhor ter uma idéia de como faz. Qualquer coisa grita denovo.

Até!

C

Blz era isso mesmo, mas ai surgiu outro problema no trecho de código abaixo

public Object getValueAt(Object node, int column) {

[color=orange]System.out.println(column); < Colunas que vou mostrar na treeTable são 4 colunas[/color]     if (column <= 1)

{return getChildren(node) [column];
} else {
    	 return null;
     }



}

Eu leio digamo os filhos que são as contas de e-mail que busco no banco
e da este erro:

[color=red]Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0[/color]

Como eu posso tratar este erro???

maquiavelbona

Posso estar errado, mas não deveria ser:

...
if (column >= 1) 
{return getChildren(node) [column]; 

} ...

Ao invés de:

...
if (column <= 1) 
{return getChildren(node) [column]; 

} ...

Do jeito que está, você está exigindo um endereço de array por de 1 para baixo.

E outro problema é que o node está vazio, por isso dá a exception de Falta de Indíces da Array.

Ajudaria se colocasse algo mais da stacktrace.

Até mais!

C

Os problemas anteriores todos solucinados coma sua ajuda o problema é novamente a conversão de valores:
Olha só o que estou fazendo:

private ArrayList parents= new ArrayList();
 
 CreateParent parent1 = new CreateParent(cod, desc);
 ResultSet uprs2 = stmt2.executeQuery(query);
 		   
 		   	while (uprs2.next()){
 		   		
 		   	   String codigo = uprs2.getString("COD_FUNC"); 
 		   	   String nome   = uprs2.getString("NOME_FUNC"); 
 		   	   String email  = uprs2.getString("EMAIL"); 
 		   	   String fone   = uprs2.getString("NUM_FONE"); 
 		   	   parent1.addCodList(codigo);
 		   	   parent1.addEmailAddress(email);
 		   	   parent1.addFoneNumber(fone);
 		   	   parent1.addNameList(nome);
 		   	  
 		   
 		   	 
 		   	 } 
 		   
 		    parents.add(parent1); 
 
 
 Me metodo 
 public void addCodList(String codigo) {
 	childremcod.add(codigo);
 }
 
 e para recuperar o valor
 Uso o método:
 public String[] getCod(int column) {
 	System.out.println(((String[]) childremcod.toArray(new String[0])));
 return ((String[]) childremcod.toArray(new String[0]));
 }

O problema e que o retorno vem no seguinte formato:
[Ljava.lang.String;@197d257
[Ljava.lang.String;@194df86
[Ljava.lang.String;@1ac04e8
E não o valor do codigo do funcionário que 01, 02, 03
Já tentei todos os tipode cast para recupera a string.

maquiavelbona

Opa. Eu acho que você está inventando demais tentando fazer muitos casts sem precisar. Creio que haja algo mais simples que isso. Você acabou de me mandar um trecho de código que não pude tirar quase nenhuma conclusão dele. Se puderes mandar um pouco mais(principalmente daonde você retira childremcod, os parametros para o retorno do array dele entre outros) ajudaria em muito.

Atenciosamente,
Marcos iriarte

C
Boa tarde. Os problemas com a inserção de dados eu resolvi, tenho uma pequena dúvida: É possivel converter uma classe para objeto??? Tenho o método abaixo que deve retornar um objeto.
Object[] children; 
 protected Object[] getChildren() {
/** Neste ponto associa uma classe para um objeto ***/
                  Estrutura childTree = (Estrutura) htchildrem.get(codigo);
	   children[i] = new CreateTree(childTree);
                   return children; 
	    
}
Mas ocorre o erro abaixo:

java.lang.NullPointerException

Como posso solucinar ou não tem solução?????

maquiavelbona

Em que linha ele retorna essa exception?
Ele pode não estar retornando o esperado e sim ou um valor null ou uma outra exception que disparou essa outra nesse momento do código, fazendo assim que o retorno da variável não tenha sido inicializado e ocasionando o NullPointerException.

C

Na linha at CreateTree.getChildren(CreateTree.java:51)
e justamente quando eu comento esta linha não ocorre o erro.
Posso transfornar uma classe em objeto???
Como posso contarnar o erro??? Testando se o valor de retorno esta diferente de NULL???

maquiavelbona

Daonde você tira o i de:

children[i] = new CreateTree(childTree);

? E verifica se Estrutura childTree = (Estrutura) htchildrem.get(codigo);
Não é nulo, pode ser que você esteja passando o parâmetro nulo aqui.

C
[code] for(int i=0;i<arraychildrem.size();i++){
		                  String codigo = (String) arraychildrem.get(i);
		                  Estrutura childTree = (Estrutura) htchildrem.get(codigo);
	                  children[i] = new CreateTree(childTree);
[/code] }
maquiavelbona
Tem duas possibilidades:

Ou código é nulo e passa para frente o erro;

ou childTree é inválido porque com esse código, o método não retorna algo que ele aceite;

Tente ver quais são os valores e se realmente são aceitos nas classes.

Toda classe tem como ser colocada em um Object, logo que toda classe extende por definição de Object (somente tipos primitivos que não) no Java.

Eu to indo embora mas mais tarde eu volto.
Até mais e boníssima noite.

C

O erro continua já tentei de tudo para entender o que estou fazendo, criando uma estrutura em 3 niveis com o Pai --> Filhos --> netos

// Neste ponto esta posicionado no registro pai da esttutura
	    	// o Array tem os códigos dos filhos na arvore
		    for(int ii=0;ii<array.size();ii++){
				String str = (String) array.get(ii);
				
				TreeNode parent;
				try {
					parent = new TreeNode();
					//Carrega HashTable com o array dos código dos filhos
					htparent = parent.getTableParent();
					// Posiciona na classe especifica que queor buscar
					Estrutura TreeView = (Estrutura) htparent.get(str);
					String CodPai = TreeView.getParent();
				    if(CodPai != null) {
				      ArrayList arraychildrem = new ArrayList();
				      arraychildrem = null;
				      // Busca no filho o código dos netos na estrutura
					  arraychildrem = TreeView.getCodList();
					  for(int i=0;i<arraychildrem.size();i++){
		                  String codigo = (String) arraychildrem.get(i);
		                  TreeNode TreeChildrem;
			      			try {
			      				
			      				TreeChildrem = new TreeNode();
			      				
			      				//Carrega o Hashtable com o array dos códigos dos netos
			      				htchildrem = TreeChildrem.getTableChildrem();
			      				
			      				//Posiciona no neto
			      				Estrutura childTree = (Estrutura) htchildrem.get(codigo);
			      				
			      				// Somnete para verificação se esta posicionado na classe corretamente
			      				String ValorCodigo = childTree.getCodigo();
			      				
			      				System.out.println("ValorCodigo:      " + ValorCodigo);
			      				System.out.println("Posição do array: " + i);
			      				// Aqui ocorre o erro Com qualquer uma das formas abaixo de
			      				// atribuir uma classe para o Objeto
			      				// O objeto é definido como Object[] children;
				                children[i] = childTree ;//new CreateTree(childTree);
			      			} catch (SQLException e1) {
			      				// TODO Auto-generated catch block
			      				e1.printStackTrace();
			      			}
		                  
		              } 
				    } 
					
				} catch (SQLException e1) {
				  e1.printStackTrace();
				}
			}

Mensagem de erro somente para verificação do ponto do erro:
ValorCodigo: 01 <--- o código esta correto é a classe que con´tém o primeiro neto
Posição do array: 0 < ---- Primeira posição do array
java.lang.NullPointerException
at CreateTree.getChildren(CreateTree.java:75)

maquiavelbona

Bom dia.

Vou fazer uma pergunta que já deveria ter feito a um tempo atrás.
quando você definiu children[], como você inicializou?
Fizeste algo assim?:

Object[] children;

Porque um erro extremamente possível é que você não definiu o tamanho do array de object. Um exemplo seria esse:

Object[] os = new Object[10]; os[0]= new Integer(2); os[1]= "as"; for (int i = 0; i < os.length; i++) { System.out.println(os[i]); }

Assim ele irá retornar os valores esperados, se declarares o tamanho em :

Object[] os = new Object[10];

Irá fazer com que o objeto seja inicializado. Se fizeres assim:

Object[] os;

// OU

Object[] os = null;

Ele irá lançar um NullPointerException mesmo, pois você somente disse que aquele objeto é do tipo array de Object mas não falou que o Objeto é realmente um array de Object(você não inicializou o objeto, e quando utilizas array dessa maneira, é necessário definir tamanho). Sei que não consegui explicar direito mas quaisquer dúvidas, não teime em responder ao tópico.

C

Eu compreendi, acho que é isso mesmo mas tenho sometne uma pergunta, é se o tamanho do array de objetos for dinamico, pois vou estar lendo a base de dados então não se o tamanho vai depender da quantidade de registro lidos.
Como eu faço para inicializar???

C

Na verdade neste ponto eu tenho o array

arraychildrem = TreeView.getCodList();
E em seguida :
for(int i=0;i<arraychildrem.size();i++){
/*** o array vai ter este tamanho
children[i] = childTree ;//new CreateTree(childTree);

					    }

Como eu faço para pegar o tamnho do arraychildrem para incializar o array children já tentei com size mas da erro?????

maquiavelbona

Não dá para definir dinamicamente o tamanho de uma array sem destruir os dados contido nela anteriormente.
Uma maneira fácil de contornar esse problema é utilizar denovo a classe ArrayList ou quaisquer classes que implementem as interfaces Collection e List, e quando fores realmente usar a array de objetos, utilizar o método toArray() de ArrayList, fazendo assim com que tenha um array de Object dinâmico. Segue exemplo abaixo:

ArrayList array = new ArrayList(); array.add(new Integer(2)); array.add("as"); Object[] os = array.toArray(); for (int i = 0; i < os.length; i++) { System.out.println(os[i]); }

Isso irá nos retornar os valores como deveriam ser retornados e com tamanho dinâmico.
Espero ter ajudado.

C

Então se eu fizar assim :

arraychildrem = TreeView.getCodList(); children = arraychildrem.toArray();
Deve funcionar???

maquiavelbona
Creio que o melhor seria algo assim:
List children = new Arraylist();
for(int i=0;i<arraychildrem.size();i++){
 		                  String codigo = (String) arraychildrem.get(i);
 		                  TreeNode TreeChildrem;

try {
 			      				
 			      				TreeChildrem = new TreeNode();
 			      				
 			      				//Carrega o Hashtable com o array dos códigos dos netos
 			      				htchildrem = TreeChildrem.getTableChildrem();
 			      				
 			      				//Posiciona no neto
 			      				Estrutura childTree = (Estrutura) htchildrem.get(codigo);
 			      				
 			      				// Somnete para verificação se esta posicionado na classe corretamente
 			      				String ValorCodigo = childTree.getCodigo();
 			      				
 			      				System.out.println("ValorCodigo:      " + ValorCodigo);
 			      				System.out.println("Posição do array: " + i);
 			      				// Aqui ocorre o erro Com qualquer uma das formas abaixo de
 			      				// atribuir uma classe para o Objeto
 			      				// O objeto é definido como Object[] children;
 				                children.add(childTree) ;//new CreateTree(childTree);
 			      			} catch (SQLException e1) {
 			      				// TODO Auto-generated catch block
 			      				e1.printStackTrace();
 			      			}
}
Object[] saida = children.toArray();

Creio que esse código funcione.

C

Funcionol que é uma blz.
Valeu pela força.
Obrigado mesmo tem enreço de e-mail particular quando estiver 100% mando um print das telas.

maquiavelbona

Que ótimo! Boa sorte finalizando as coisas aí.
Qualquer coisa, pode mandar email para [email removido].

Até mais!
Marcos Iriarte

Criado 29 de junho de 2006
Ultima resposta 13 de jul. de 2006
Respostas 44
Participantes 3