hsqldb из Java-приложения - PullRequest
0 голосов
/ 11 марта 2011

Я пишу настольное приложение на Java для добавления / отображения сотрудников. Я думал об использовании hsqldb. Я создал программу, как показано ниже

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

Затем я изменил оператор вставки, чтобы добавить EMPNAME4, EMPNAME5, EMPNAME6

Я ожидал, что это напечатает сотрудников 1,2,3,4,5,6 но когда я запустил код, я получил только новые значения.

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

Разве невозможно сохранить значения при использовании jdbc: hsqldb: file? Я также хотел бы проверить, существует ли таблица .. и выполнить оператор создания таблицы, только если таблица не существует. Может кто-нибудь сказать мне, как это сделать?

Или мне нужно использовать режим сервера? Если да, то как мне создать БД из программы?

пожалуйста, помогите .. это моя первая попытка jdbc / hsqldb ..

спасибо,

знак

Ответы [ 5 ]

1 голос
/ 11 марта 2011

Насколько я знаю, таблица не будет переопределять предыдущую, если вы попытаетесь создать ее при втором запуске - она ​​просто потерпит неудачу с SQLException.Поэтому ужасный способ - создать таблицу, затем перехватить исключение SQL, если оно уже есть, и сделать что-то еще.Я не знаю лучшего способа с HSqlDB, это тот же метод, который я использую с программой, над которой я сейчас работаю.

Во многих языках на основе SQL есть команда CREATE TABLE IF NOT EXISTS,но, к сожалению, его нет в HSqlDB.

РЕДАКТИРОВАТЬ: Согласно комментарию ниже, похоже, что нечто подобное на самом деле в версии 2.1.

1 голос
/ 11 марта 2011

Мы столкнулись с этой проблемой в нашем Java-приложении.

Ваш оператор создания таблицы создает таблицу в памяти.

В дополнение к оператору SET WRITE_DELAY 0 вам необходимо выполнитьSQL COMMIT после вставок и SQL SHUTDOWN, когда вы хотите, чтобы HSQL фактически записал строки в памяти в файл конфигурации.

0 голосов
/ 31 июля 2011

Я столкнулся с этой проблемой и потратил около часа, пытаясь разобраться в этом. Вот что мне помогло. Когда вы впервые запускаете HSQLDB на основе файлов в своем Java-приложении, в корне каталога db, определенного в URL-адресе jdbc, создается несколько файлов. Один из этих файлов называется mydbname.script, в этом файле найдите строку SET FILES WRITE DELAY и установите значение 0. Это необходимо сделать только в том случае, если вы впервые запустили базу данных HSQLDB без свойства hsqldb.write_delay=false. Итак, если вы забудете добавить это свойство write_delay при первом запуске вашей базы данных HSQLDB, вам нужно будет обновить файл 'mydbname.script'. Каждый раз, когда вы запускаете БД, этот скрипт выполняется. Надеюсь, это поможет.

0 голосов
/ 24 марта 2011

Текущие версии HSQLDB v2.1.0 для загрузки - это не версия 2.1.0, а старая версия 1.8.1. Так было с начала февраля.

Любой, кто использует версию 2.0 для своей БД, не сможет ее использовать.

похоже, что есть проблемы с текущей версией 2.0 и OpenOffice v3.3

Пожалуйста, вернитесь к версии 1.8, если можете ....

0 голосов
/ 11 марта 2011

У меня была проблема с использованием внутрипроцессного HSQLDB раньше, когда он не сохранялся в базе данных. Я обнаружил, что изменение параметра WRITE_DELAY исправило это. Попробуйте добавить следующее к вашему .script файлу (он должен идти вверху, возможно, после чего-то вроде GRANT DBA TO SA):

SET WRITE_DELAY 0
...