我在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 ..
感谢,
标记
答案 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时都会执行脚本。希望有所帮助。