繁体   English   中英

来自java app的hsqldb

[英]hsqldb from java app

我在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 ..

谢谢,

标记

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

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

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

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

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

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

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

SET WRITE_DELAY 0

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

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

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

如果可以的话,请恢复到1.8版本....

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM