Problemas em criar tabela com dados da query

2 respostas
Diana

Pessoal, eu tenho uma tabelaModelo…onde faco a conexao e passo os parametros (tabela,campos,criterios) e a tabela retorna as colunas e as linhas…e monta a tabela.
o que esta acontecendo eh que quando passo criterio para me mostrar um registro…por exemplo: id_cliente=15…ele me retorna uma linha…ateh ai beleza…mas quando peco para ele me mostrar todos os registros da tabela…dah pau…
mostra essa mensagem de erro:
Código:

115 - eu sei que ele esta varrendo a tabela pq aqui mostra o numero de linhas da tabela…

erro em RetornarLinhas: Invalid character data was found. This is most likely caused by stored data containing characters that are invalid for the character set the database was created in. The most common example of this is storing 8bit data in a SQL_ASCII database.

Abaixo segue o codigo da tabela:
Código:

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.sql.Statement;
import javax.swing.JTable;

import javax.swing.table.AbstractTableModel;

import javax.swing.table.TableModel;

/**

  • Esta classe extende de um objeto swing JTable, tornando-o em um objeto que
  • permite pegar dados de uma várias tabelas de um ou mais bancos de dados.
  • @version 1.0 21/04/2004
  • @author heber
  • @see javax.swing.JTable
    */

public class TableModelo extends JTable {

private Object[] col; 

private Object[][] lin; 
Connection conn=null; 

/** 
 * Construtor Padrão 
 */ 
public TableModelo() { 
   Conexao(); 
}
public void Conexao () {

String dbdriver = org.postgresql.Driver;

String url = jdbc:postgresql://200.215.114.175/servicos?charset=WIN1256”; //ISO8859-1

String dbuser = msitec;

String dbpass = ms340101;
try{

Class.forName(dbdriver);

conn=DriverManager.getConnection(url,dbuser,dbpass);

System.out.println(Banco conectado pelo gerenciador);

}catch (Exception e)

{

System.out.println(Banco não conectado !!);

}

}
/** 
 * Construtor que se conecta ao Banco de Dados e mostra uma pesquisa 
 * @param tabelas tabelas que serão consultadas 
 * @param campos campos que serão mostrados na table 
 * @param criterios critérios da pesquisa 
 * @see java.sql 
 */ 
public TableModelo(String tabelas,String campos,String criterios) { 

  Conexao(); 
    lin = retornarLinhas(tabelas, campos, criterios); 
    col = retornarColunas(tabelas, campos, criterios); 
  createModel(); 

    super.setVisible(true); 
} 

/** 
 * Retorna o nome das colunas 
 * @param tabelas tabelas que serão pesquisadas 
 * @param campos campos que serão retornados 
 * @param criterios parâmetros da cláusula WHERE, ex.: "COD = 001" 
 * @return obj[] Nome das colunas 
 * @see java.sql.ResultSet 
 */

private Object[] retornarColunas(String tabelas,
String campos, String criterios) {

String query = "SELECT " + campos + " FROM " + tabelas; 
     if (criterios.length() > 0) query = query + " WHERE " + criterios; 
     Statement s; 
     ResultSet rs; 
     ResultSetMetaData rsmd; 
     Object obj[] = null; 

     try { 
        s = conn.createStatement(); 
        s.executeQuery(query); 
        rs = s.getResultSet(); 

        rsmd = rs.getMetaData(); 

        obj = new Object[rsmd.getColumnCount()]; 
        for (int i = 1; i <= obj.length; i++) { 
           obj[i - 1] = rsmd.getColumnName(i); 
        } 
     } catch (Exception ex) { 
        System.out.println("RetornarColunas: " + ex); 
     } 

     return (obj); 
  } 
  public String[] retornarTipoColunas(String tabelas,String campos,String criterios){ 
     String query = "SELECT " + campos + " FROM " + tabelas; 
     if (criterios.length() > 0) query = query + " WHERE " + criterios; 
     String [] tipo = null; 
     Statement s; 
     ResultSet rs; 
     ResultSetMetaData rsmd; 
     try{ 
        s=conn.createStatement(); 
        s.executeQuery(query); 
        rs=s.getResultSet(); 
        rsmd=rs.getMetaData(); 
        tipo=new String[20]; 
        for(int i=0;i<=rsmd.getColumnCount();i++){ 
           tipo[i]=rsmd.getColumnTypeName(i+1); 
           System.out.println(tipo[i]); 
        } 
     }catch(SQLException ex){ 
        System.out.println("Erro tipo:"+ex); 
     } 
     return tipo; 
  } 
  /** 
   * A JTable usa a classe de coluna para descobrir como formatar a 
   * celula. Esse metodo descobre o tipo do SQL. 
   * @return a classe JAVA para coluna 
   */ 
      
   
     /** 
            * Retorna toda a pesquisa 
            * @param tabelas tabelas que serão pesquisadas 
            * @param campos campos que serão retornados 
            * @param criterios parâmetros da cláusula WHERE, ex.: "COD = 001" 
            * @return obj[][] conteúdo das pesquisas 
            * @see java.sql.ResultSet 
            */
private Object[][] retornarLinhas(String tabelas,

String campos, String criterios) {

String query = "SELECT " + campos + " FROM " + tabelas;

if (criterios.length() > 0) query = query + " WHERE " + criterios;

Statement s;

ResultSet rs;

ResultSetMetaData rsmd;

Object obj[][] = null;

String []tipo=null;
try { 
        s = conn.createStatement(); 
        s.executeQuery(query); 
        rs = s.getResultSet(); 

        rsmd = rs.getMetaData(); 
        int totalLinhas = retornarCount(query); 
        System.out.println(totalLinhas); 
        if (totalLinhas <= 0) { 
           obj = new Object[1][1]; 
           obj[0][0] = "ERRO: Nenhuma linha afetada"; 
           return (obj); 
        } 
        obj = new Object[totalLinhas][rsmd.getColumnCount()]; 

        int i = 0; 
         
        while (rs.next()) { 
           Object obj2[] = new Object[rsmd.getColumnCount()]; 
           for (int j = 1; j <= rsmd.getColumnCount(); j++) { 
              if(rsmd.getColumnTypeName(j).equals("varchar")) 
              obj2[j-1]=rs.getString(j); 
              if(rsmd.getColumnTypeName(j).equals("int4")) 
              obj2[j-1]=""+rs.getInt(j); 
              if(rsmd.getColumnTypeName(j).equals("date")) 
              obj2[j-1]=rs.getDate(j); 
              if(rsmd.getColumnTypeName(j).equals("boolean")) 
              obj2[j-1]=""+rs.getBoolean(j); 
              if(rsmd.getColumnTypeName(j).equals("time")) 
              obj2[j-1]=rs.getTime(j); 
           } 
        obj[i] = obj2; 
        i++; 
        } 
     }catch (SQLException ex) { 
        System.out.println("erro em RetornarLinhas: " + ex); 
        obj = new Object[1][1]; 
        obj[0][0] = "ERRO: " + ex; 
        return (obj); 
     } 

     return (obj); 
  } 

  /** 
   * Conta a quantidade de linhas retornadas da pesquisa 
   * @param query instrução sql 
   * @return quant quantidade de linhas 
   * @see java.sql.ResultSet 
   */ 

  private int retornarCount(String query) { 
     Statement s; 
     ResultSet rs; 

     int quant = 0; 
     try { 
        s = conn.createStatement(); 
        s.executeQuery(query); 
        rs = s.getResultSet(); 
        while (rs.next()) { 
           quant++; 
        } 
     } catch (Exception ex) { 
        System.out.println("RetornarCount: " + ex); 
        return (0); 
     } 

     return (quant); 
  } 

  /** 
   * Insere linhas na Tabela 
   * @param quant quantidade de linhas que serão adicionadas 
   */ 

  public void insertRows(int quant) { 
     Object[][] obj = lin; 

     lin = new Object[obj.length + quant][col.length]; 

     for (int i = 0; i < lin.length; i++) { 
        if (i < obj.length) { 
           lin[i] = obj[i]; 
        } else { 
           for (int j = 0; j < lin[i].length; j++) { 
              lin[i][j] = " "; 
           } 
        } 
     } 

     createModel(); 

     super.setVisible(true); 
  } 

  /** 
   * Deleta linha(s) selecionada(s) 
   */ 

  public void deleteRow() { 
     int[] row = super.getSelectedRows(); 

     for (int i = (row.length - 1); i >= 0; i--) { 
        deleteRow(row[i]); 
     } 

     createModel(); 

     super.setVisible(true); 
  } 

  private void deleteRow(int row) { 
     Object[][] o = lin; 
     lin = new Object[o.length - 1][col.length]; 
     int j = 0; 

     for (int i = 0; i < o.length; i++) { 
        if ((i != row)) { 
           lin[j] = o[i]; 
           j++; 
        } 
     } 
  } 

  private void createModel() { 
     int[] colW = new int[super.getColumnCount()]; 

     for (int i = 0; i < colW.length; i++) { 
        colW[i] = super.getColumn(super.getColumnName(i)).getWidth(); 
     } 

     TableModel tableModel = new AbstractTableModel() { 

        public int getColumnCount() { 
           return col.length; 
        } 

        public int getRowCount() { 
           return lin.length; 
        } 

        public Object getValueAt(int row, int col) { 
           return lin[row][col]; 
        } 

        public String getColumnName(int column) { 
           return ("" + col[column]); 
        } 

        public boolean isCellEditable(int row, int col) { 
           return (false); 
        } 

        public void setValueAt(Object aValue, int row, int column) { 
           lin[row][column] = aValue; 
        } 
     }; 

     super.setModel(tableModel); 

     for (int i = 0; i < colW.length; i++) { 
        super.getColumn(super.getColumnName(i)).setPreferredWidth(colW[i]); 
     } 
  }

}

Galera preciso de ajuda!!!

2 Respostas

dudaskank

Bom, antes de mais nada, sempre que colocar código, faça entre as tags e para sair formatado, só que em letras minúsculas o code…

//viu só como fica bonitinho?

Hehe… bem, vamos a minha resposta pra sua pergunta…

Eu não conheço muito bem a JTable, então realmente não sei se irei ajudar, mas se gundo a mensagem de erro, existe um caractere inválido, provavelmente em uma string de texto como a mensagem diz.

ASCII são códigos para cada caractere, como letras, números, pontuação, etc, que vai do 0 ao 127. Entretanto, caracteres como os que tem acento é muito comum estarem acima deste número.

Então, minha sugestão é você testar o mesmo código em uma tabela de testes, onde as strings não tenham nenhum acento ou cedilha, só as letras normais mesmo, e vê se aparece na tela corretamente. Caso seja isso, creio que você deverá trocar o tipo de dado que é guardado na tabela para um que armazene texto em UNICODE por exemplo, que seria o ideal…

Mas isto é só uma suposição… seria isso que eu tentaria pelo menos…

Falou :slight_smile:

cv1

String url = "jdbc:postgresql://200.215.114.175/servicos?charset=WIN1256"; //ISO8859-1

WIN1256!? Que raio de encoding eh esse? :smiley:

Confira no PostgreSQL qual o encoding (charset) usado no database ‘servicos’, e use o encoding certo. Eh o unico jeito de resolver de vez o problema. E, ah, se vc nunca mais quiser ter problemas assim, use UTF-8 :wink:

Criado 27 de abril de 2004
Ultima resposta 28 de abr. de 2004
Respostas 2
Participantes 3