Problemas com HSQLDB

9 respostas
danieldestro

Eu tenho o seguinte código:

import java.sql.*;
import java.util.Date;

public class MyTest {

    Connection conn;

	public MyTest(String db_prefix) throws Exception {
        Class.forName("org.hsqldb.jdbcDriver");
        conn = DriverManager.getConnection("jdbc:hsqldb:" + db_prefix, "sa", "");
    }

    public void shutdown() throws SQLException {
        conn.close();
    }

    public synchronized void query(String expression) throws SQLException {
        Statement st = null;
        ResultSet rs = null;
        st = conn.createStatement();
        rs = st.executeQuery( expression );
        dump(rs);
        st.close();
    }

    public synchronized void update(String expression) throws SQLException {
        Statement st = null;
        st = conn.createStatement();
        int i = st.executeUpdate(expression);
        if (i == -1) {
            System.out.println("db error : " + expression);
        }
        st.close();
    }

    public static void dump(ResultSet rs) throws SQLException {
        ResultSetMetaData meta   = rs.getMetaData();
        int               colmax = meta.getColumnCount();
        int               i;
        Object            o       = null;
        for(int j=1; j<=colmax; j++ ) {
			System.out.print(meta.getColumnName(j)+" 	");
		}
		System.out.println(" ");
        while( rs.next() ) {
            for (i = 0; i < colmax; ++i) {
                o = rs.getObject(i + 1);
                System.out.print(o==null ? "" : o.toString() + " ");
            }
            System.out.println(" ");
        }
    }

    public static void main(String[] args) {
        MyTest db = null;
        try {
            db = new MyTest("MyTest");
        } catch (Exception ex1) {
            ex1.printStackTrace();
            return;
        }
        try {
            db.query("CREATE TEXT TABLE pessoa ( id INTEGER IDENTITY, nome VARCHAR(50), idade INTEGER, data_nasc DATE)");
            db.query("SET TABLE pessoa SOURCE "pessoa.csv"");
        } catch (SQLException ex2) {
            ex2.printStackTrace();  // second time we run program
        }
        try {
            db.update("INSERT INTO pessoa(nome,idade,data_nasc) VALUES('Daniel', 24, '12-07-1979')");
            db.update("INSERT INTO pessoa(nome,idade,data_nasc) VALUES('Marcelo', 23, null)");

            db.query("SELECT * FROM pessoa"); //WHERE idade > 20");
        } catch (SQLException ex3) {
            ex3.printStackTrace();
        } finally {
			if( db != null ) try { db.shutdown(); } catch( Exception ex ) {}
		}
    }
}

Estou usando o HSQLDB 1.7.1. Neste modo, que grava os dados em um arquivo texto, separado por ;, estranhamente ele não grava o último campo definido na criação da tabela. alguém sabe se isso é um bug do HSQLDB?

Se eu uso o modo normal ele funciona.

Pergunta, qual a menlhor maneira de usar este DB com persistência dos dados em disco?

9 Respostas

Ironlynx

Tb tive desse problema Daniel,resolvi chamando executeUpdate() para cada insert q eu der!(usando PreparedStatement)e eu criei um método de inserção próprio tb…agora tô com um problema chato aqui,pois sempre que eu executo pela segunda vez o meu programa(usando o hsqldb como banco) ele acusa q a tab jah foi criada,e não anexa outras inserções…
Mesmo criando boolean existe=(new File(“tabela.script”)).exists(); e se ela existir,não criá-la(não executar create table q fica dentro do .script ,apenas qdo o programa rodar na primeira vez),ele acusa do mesmo modo…vc jah teve desse problema? :?

danieldestro

E ai Ironlynx,
Eu tentei fazer o que vc sugeriu e não funcionou!
Agora, sobre o seu problema, eu nunca tive.
Estou evitando de usar o HSQLDB até que eu resolva este problema que estou tendo.
Por eqto vai de Access mesmo. :oops:

Ironlynx

Daniel,essa sua linha:

db.query("SET TABLE pessoa SOURCE "pessoa.csv"");

Passa na compilação?
Vou testar da sua forma e ver o dah…(vou dar mais uma zoiada na documentação)
Tb tenho interesse em usar o HSQLDB(antes de td eh free!),dah para distribuir aplicações sem se procupar com o “Custo BD” hehehe
E no meu caso,o chato é acusar q a Tabela jah foi criada,na 2ª vez q eu ponho para executar uma aplicação swing e inserir novos dados…
Tem algum detalhe q não devo estar vendo… :roll:

danieldestro

Compila sim… é o GUJ que come os caracteres… mas seria assim

"

Então… toda vez que roda sua app vc precisa criar a tabela? Neste exemplo que eu postei ele dá pau tbm, mas ignora e eu continuo a app.

Ironlynx

Não!Só cria se não existir(ou seja,cria ao rodar na primeira vez e passa em seguida a executar os demais comandos … )!Mas o problema qh q tah acusando q a tabela jah foi criada mesmo q eu não ponha um create table(na segunda vez q a mesma eh acessada!)Ah e não eh uma TEXT TABLE não!Vou testar mais algumas coisas aqui(incluso o seu problema) se tiver progressos eu posto aqui!

danieldestro

Sinceramente, não entedí qual o seu problema com a criação da tabela.

Já existe? Ele vai dar pau, certo? Então ignora a Exception e segue o jogo.

Ironlynx

Mas se torna inútil a aplicação,pois não indexa(inclui mais dados) mais nada…
O problema eh + ou - assim:
Se tabela não existe
new…
criaTabela()//Create cadastro…
Senão
//tabela existe
new Tela();//executa todo o resto
O problema eh q sempre acusa a existência da tabela mesmo qdo eu não peço para criá-la?Entendeu?Aí ele ignora os inserts subseqüentes…
Como vc verificaria a existência de uma tabela(se não existir criá-la),e se ela existir,escrever nela?
Tem um forum para problemas no hsqldb:
http://sourceforge.net/forum/?group_id=23316
Vou dar uma pesquisada sobre o seu problema da data no .csv,e no meu(tem mais de 5mil msgs!)se não encontrar,posto lá!

Ironlynx
Daniel,acho que matei o seu problema!Vc deve tah usando a versão 1.7.1 ou inferior né?Essa versão tem problemas com TEXT TABLES!Baixe a 1.7.2_RC_5(eu agora uso esse q gera um .log) e execute esse aqui(usei pstmt!):
import java.sql.*; 

public class MyTest { 
    private static PreparedStatement pstmt = null;
     static Connection conn; 

   public MyTest(String db_prefix) throws Exception { 
        Class.forName("org.hsqldb.jdbcDriver"); 
        conn = DriverManager.getConnection("jdbc:hsqldb:" + db_prefix, "sa", ""); 
    } 

    public void shutdown() throws SQLException { 
        conn.close(); 
    } 

    public static void main(String[] args) { 
        MyTest db = null; 
        try { 
            db = new MyTest("MyTest"); 
        } catch (Exception ex1) { 
            ex1.printStackTrace(); 
            return; 
        } 
        try { 
            pstmt = conn.prepareStatement("CREATE TEXT TABLE pessoa ( id INTEGER IDENTITY, nome VARCHAR(50), idade INTEGER, data_nasc DATE)"); 
            pstmt.executeUpdate(); 
            pstmt = conn.prepareStatement("SET TABLE pessoa SOURCE \"pessoa.csv\""); 
            pstmt.executeUpdate();  
        } catch (SQLException ex2) { 
            ex2.printStackTrace();  // second time we run program 
        } 
        try { 
            pstmt=conn.prepareStatement("INSERT INTO pessoa(nome,idade,data_nasc) VALUES(?,?,?)"); 
          
            pstmt.setString(1,"Daniel");
            pstmt.setInt(2,24);
            pstmt.setDate(3,Date.valueOf("1979-10-07"));
            pstmt.executeUpdate();
            pstmt=conn.prepareStatement("INSERT INTO pessoa(nome,idade,data_nasc) VALUES(?,?,?)"); 
            pstmt.setString(1,"Marcelo");
            pstmt.setInt(2,23);
            pstmt.setDate(3,null);
            pstmt.executeUpdate();
             
        } catch (SQLException ex3) { 
            ex3.printStackTrace(); 
        } finally { 
         if( db != null ) try { db.shutdown(); } catch( Exception ex ) {} 
      } 
    } 
}
Veja se não rodará OK e a data será gravada tb corretamente no seu pessoa.csv !
danieldestro

Carinha, valeu mesmo! Vou dar uma olhada lá.

Sobre o sue problema de criar tabela ou não e inserir novos dados. Na versão 1.7.1, com o código que eu postei, funciona numa boa.

Criado 8 de abril de 2004
Ultima resposta 30 de abr. de 2004
Respostas 9
Participantes 2