[英]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.