Problema com o HSQLDB (Insert)

10 respostas
oriso

Olá a todos,
Venho neste post pedir ajuda com a conexão entre java e hsqldb. Eu já li o artigo contido no fórum sobre hsqldb além de vários slides coletados pelo google e o guia do próprio BD (não totalmente). Contudo estou tendo um problema que não consigo solucionar, eu tento fazer um insert no BD mas aparece sempre a seguinte mensagem:

Conectou!
Erro na query! java.sql.SQLException: user lacks privilege or object not found: CLIENTE

Segue a classe que estou utilizando para a conexão (não fui eu quem a criou, estou utilizando por caráter de aprendizagem) e a classe que utilizo para fazer a inserção.

Classe Banco

public class Banco 
{
    private Connection con;	//Conexão
    private Statement stm;	
    private ResultSet rs;
    private String DRIVER = "org.hsqldb.jdbcDriver";
    private String URL = "jdbc:hsqldb:file:/banco/PDS";
    private String usuario = "SA";
    private String senha = "";

    
    public void abrirConexao()
    {
        try
        {
		    Class.forName(getDriver());

            setCon(DriverManager.getConnection(getUrl(), getUsuario(), getSenha()) );

            System.out.println("Conectou!");
		}
        catch(ClassNotFoundException e)
        {
		    System.out.println("Erro ao carregar o driver JDBC. ");
		}
        catch(SQLException e)
        {
		    System.out.println("Erro de SQL: " + e);
		    e.printStackTrace();
		}
    }

    public void executarQuery(String sql)
    {
        try
        {
            setStm( getCon().createStatement() );
            getStm().execute(sql);
            setRs( getStm().getResultSet() );
            getStm().execute("SHUTDOWN");
        }
        catch(SQLException e)
        {
            System.out.println("Erro na query! " + e);
        }
    }

    /**
     * @return the con
     */
    public Connection getCon() 
    {
        return con;
    }

    public void setCon(Connection c)
    {
        this.con = c;
    }

    /**
     * @return the stm
     */
    public Statement getStm()
    {
        return this.stm;
    }

    public void setStm(Statement s)
    {
        this.stm = s;
    }

    /**
     * @return the rs
     */
    public ResultSet getRs() 
    {
        return this.rs;
    }

    public void setRs(ResultSet rs)
    {
        this.rs = rs;
    }

    /**
     * @return the DRIVER
     */
    public String getDriver()
    {
        return this.DRIVER;
    }

    /**
     * @return the URL
     */
    public String getUrl()
    {
        return this.URL;
    }

    public String getUsuario()
    {
        return this.usuario;
    }

    public String getSenha()
    {
        return this.senha;
    }

}

Classe de teste para inserção

public class inserindoNoBD 
{	
	public static void main(String[] args)
	{
		Banco x = new Banco();
		x.abrirConexao();
		x.executarQuery("INSERT INTO PUBLIC.CLIENTE (COD,NOME) VALUES(NULL,'Newton');");
	}
}

Segue em anexo a imagem do “connect” do hsqldb

Se alguém tiver alguma outra observação pertinente sobre o assunto, alguma bibliografia sobre referente ao tema para recomendar, ou mesmo uma dica, por favor comente.

Desde já agradeço pela atenção de todos.

10 Respostas

nel

Boa tarde. Devo dizer duas coisas:

1 - Discordo de você usar métodos set e get para variavéis privadas sendo que não se trata de uma classe entity e principalmente tratando-se de variavéis relacionadas a JDBC

2 - Altere o Statement para PreparedStatement, eu recomendo.

Sobre o seu problema, você dá um insert e usa resultset, concorda que quando você insere uma informação ele não lhe retorna nada? O ResultSet é utilizado quando você efetua um Select e espera que retorne informações do seu banco. Mais um detalhe, sua string sql:

Retire o ; que colocou no fim da sua string, não há necessidade e se deixar pode ocorrer uma Exception por caracter inválido ok?
Se o executeQuery não funcionar altera para executeUpdate.

Abraços.

oriso

Olá a todos,

Olá nel, muito obrigado pela sua ajuda.

1- Concordo com o que você falou sobre os métodos set e get, dei uma reformulada na classe objetivando deixa-la semelhante ao que eu fazia em php. Contudo o meu único foco por enquanto é conseguir um contato com o HSQLDB, segue a classe reformulada, porém dei atenção no método insertBD deixando select de lado por enquanto.

2- Tentei pensar em uma forma de fazer um método com PreperedStatement de uma maneira que não ficasse “engessado”, contudo não obtive êxito por enquanto. Apesar disto fiz o teste de forma isolada com o Prepered, mas nem assim consegui uma inserção.

Para inserção eu removi o resultSet, como você argumentou não faz sentido utiliza-lo para uma inserção. Além disto removi o ponto e vírgula como você recomendou, na verdade fiz centenas de testes tirando e colocando coisas mas ainda sim nada…
Tentei também o executeQuery e o executeUpdate, mas não obtive resultados positivos.

Segue a nova classe. repare que adicionei alguns “System.out.println” em alguns pontos para tentar debugar.

public class Banco 
{
    private static Connection con;	//Conexão
    private static Statement stm;	
    private static ResultSet rs;
    private static String DRIVER = "org.hsqldb.jdbcDriver";//Driver para o hsqldb
    private static String URL = "jdbc:hsqldb:file:/banco/PDS";
    private static String usuario = "SA";
    private static String senha = "";

    public static void abrirConexao()
    {
        try
        {
		    Class.forName(DRIVER);
            con = DriverManager.getConnection(URL, usuario, senha);
            System.out.println("Conectou!");
		}
        catch(ClassNotFoundException e)
        {
		    System.out.println("Erro ao carregar o driver JDBC. ");
		}
        catch(SQLException e)
        {
		    System.out.println("Erro de SQL: " + e);
		    e.printStackTrace();
		}
    }
    public static void fecharConexao()
    {
    	  try
          {
  		   con.close();
  		   System.out.println("Desconectou!");
  		  }
    	  catch(SQLException e)
    	  {
    	    System.out.println("Erro de SQL: " + e);
  		    e.printStackTrace();
    	  }
    }

    public static void insertBD (String insert)
    {
        try
        {
        	stm = con.createStatement();
        	 //Debugando...
        	System.out.println("-->"+insert);
        	 System.out.println("-->"+stm);
        	 System.out.println("-->"+con);
        	stm.executeUpdate(insert);
            stm.execute("SHUTDOWN");
        }
        catch(SQLException e)
        {
            System.out.println("Erro na query! " + e);
        }
    }
    
    public static void selectBD(String select)
    {
    	try
    	{
            stm = con.createStatement();
            rs = stm.executeQuery(select);
            stm.execute("SHUTDOWN");
        }
        catch(SQLException e){
            System.out.println("Erro na query! " + e);
        }
    }
}
public class inserindoNoBD 
{
	public static void main(String[] args)
	{
		Banco.abrirConexao();
		Banco.insertBD("INSERT INTO PUBLIC.CLIENTE (COD,NOME) VALUES(NULL,'Newton')");
		Banco.fecharConexao();
	}
}

Resultados no console


Conectou!
–>INSERT INTO PUBLIC.CLIENTE (COD,NOME) VALUES(NULL,‘Newton’)
–>org.hsqldb.jdbc.JDBCStatement@117a8bd
–>org.hsqldb.jdbc.JDBCConnection@471e30
Erro na query! java.sql.SQLException: user lacks privilege or object not found: CLIENTE
Desconectou!

Estou achando que o problema vem de antes das ações sobre o BD.

Mais uma vez, muito obrigado pela atenção.

Laubstein_M_cio

Cara eu não manjo nada de HSQLDB, mas pela mensagem vou dar um chutão, será que não esta faltando grant??

Falow

oriso

Olá Laubstein, M?cio,

Eu confesso que eu não conhecia o GRANT, eu dei uma pesquisada e fui testar mas ainda sim não obtive mudança no resultado final. :frowning:

Muito obrigado pela dica!!

ricardo13

Estou tendo o mesmo problema !!

“user lacks privilege or object not found:”

Ricardo

V

Olá pessoal

estou com o mesmo problema :frowning:
alguém conseguiu resolver?

obrigada pela ajuda…

ricardo13

Bom,

Leia isso aqui. link

Ricardo

Alchemist

Qual a solução ?

ricardo13

Aquele link diz o seguinte:

"Memory-Only Databases

It is possible to run HSQLDB in a way that the database is not persistent and exists entirely in random access memory. As no information is written to disk, this mode should be used only for internal processing of application data, in applets or certain special applications. This mode is specified by the mem: protocol.

Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:aname", "sa", "");

You can also run a memory-only server instance by specifying the same URL in the server.properties. This usage is not common and is limited to special applications where the database server is used only for exchanging information between clients, or for non-persistent data."

Espero que tenha ajudado.

Ricardo

andreiribas

simples,

o arquivo .script do hsqldb não tem a declaração dessa tabela.

Como resolver?

CREATE MEMORY TABLE PUBLIC.CLIENTE (COD BIGINT NOT NULL PRIMARY KEY, NOME VARCHAR(30) NOT NULL)
Criado 14 de novembro de 2009
Ultima resposta 8 de abr. de 2011
Respostas 10
Participantes 7