来自java app的hsqldb

时间:2011-03-11 15:26:25

标签: java hsqldb

我在java中编写一个桌面应用程序来添加/显示employees.I想到使用hsqldb.I创建了如下程序

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class HSQLDBManualOp {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Connection connection = null;  
        ResultSet resultSet = null;  
        Statement statement = null;
        String createtablestr = "CREATE TABLE employeedetails (EMPNAME varchar(20));";
        String insertstr1 = "INSERT INTO employeedetails (EMPNAME) VALUES ('EMPNAME1')";    
        String insertstr2 = "INSERT INTO employeedetails (EMPNAME) VALUES ('EMPNAME2')";    
        String insertstr3 = "INSERT INTO employeedetails (EMPNAME) VALUES ('EMPNAME3')"; 
        try {
            Class.forName("org.hsqldb.jdbcDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try {
            connection = DriverManager.getConnection("jdbc:hsqldb:file:C:/code/java/march112011aDB", "SA", "");
        } catch (SQLException e) {
            e.printStackTrace();
        }  
        if (connection == null){
            System.out.println(" connection null");
            return;
        }
        try {
            statement = connection.createStatement();
            statement.executeUpdate(createtablestr);

            statement.executeUpdate(insertstr1);

            statement.executeUpdate(insertstr2);
            statement.executeUpdate(insertstr3);

            resultSet = statement.executeQuery("SELECT EMPNAME FROM EMPLOYEEDETAILS");
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
            while (resultSet.next()) {  
                System.out.println("EMPLOYEE NAME:" + resultSet.getString("EMPNAME"));  
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

}

}

当我运行程序时,我得到了输出

EMPLOYEE NAME:EMPNAME1
EMPLOYEE NAME:EMPNAME2
EMPLOYEE NAME:EMPNAME3

然后我更改了要添加的insert语句 EMPNAME4,EMPNAME5,EMPNAME6

我预计会打印员工1,2,3,4,5,6 但是当我运行代码时,我只获得了新值。

EMPLOYEE NAME:EMPNAME4
EMPLOYEE NAME:EMPNAME5
EMPLOYEE NAME:EMPNAME6

使用jdbc:hsqldb:file时是否无法保留值? 我还想检查表是否已经存在..并且只有在表不存在时才执行create table语句。任何人都可以告诉我该怎么做?

或者我是否必须使用服务器模式?如果是这样,我如何在程序中创建数据库?

请帮助......这是我第一次尝试jdbc / hsqldb ..

感谢,

标记

5 个答案:

答案 0 :(得分:1)

据我所知,如果你试图在第二次运行时创建它,表格将不会覆盖前一个表格 - 它只会失败并带有SQLException。所以可怕的方法是创建表,然后捕获SQL异常,如果它已经存在并执行其他操作。我不知道HSqlDB有更好的方法,它与我正在使用的程序使用的技术完全相同。

许多基于SQL的语言都有CREATE TABLE IF NOT EXISTS命令,但遗憾的是它不在HSqlDB中。

编辑:根据下面的评论,看起来类似的东西实际上是2.1版本。

答案 1 :(得分:1)

我们在Java应用程序中遇到了这个问题。

您的create table语句会创建一个内存表。

除了SET WRITE_DELAY 0语句之外,您还需要在插入后执行SQL COMMIT,并在需要HSQL实际写入内存中的行时使用SQL SHUTDOWN配置文件。

答案 2 :(得分:0)

我在使用进程内HSQLDB之前遇到了问题,因为它没有持久存储到数据库。我发现更改WRITE_DELAY参数修复了它。尝试将以下内容添加到您的.script文件中(它应该接近顶部,可能是在GRANT DBA TO SA之后):

SET WRITE_DELAY 0

答案 3 :(得分:0)

HSQLDB v2.1.0的当前下载版本不是2.1.0版本,而是旧的1.8.1版本。 自2月初以来一直如此。

任何使用版本2.0的人都无法使用它。

当前的2.0版本和OpenOffice v3.3出现了问题

如果可以,请恢复为1.8版本。

答案 4 :(得分:0)

我遇到了这个问题,花了一个小时左右试图解决这个问题。这对我有所帮助。当您在Java应用程序中首次启动基于HSQLDB的文件时,将在jdbc url中定义的db目录的根目录中创建多个文件。其中一个文件名为mydbname.script,在该文件中查找行SET FILES WRITE DELAY并将值设置为0。如果第一次启动没有hsqldb.write_delay=false属性的HSQLDB数据库,则只需执行此操作。因此,如果您在第一次启动HSQLDB数据库时忘记添加该write_delay属性,则需要更新“mydbname.script”文件。每次启动db时都会执行脚本。希望有所帮助。