0

私は現在CRUDプログラムをコーディングしており、hsql-dbを使用しています:

これが私の hsql-db コネクタ クラスです。

public class hsqlmanager {

    private static final Logger log = Logger.getLogger(hsqlmanager.class);

    private static Connection con=null;

    private static void openConnection(){
        try {
            Class.forName("org.hsqldb.jdbcDriver" );
            log.info("Loaded JDBC Driver");
        } 
        catch (Exception e) {
            log.error("ERROR: failed to load JDBC driver - " + e.getMessage());
            return;
        }

        try {
            con = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/db_test","SA","");
            log.info("Connection established");         
        }
        catch(SQLException e){
            log.error("db connection error Exception: " + e.getMessage());
        }
    }

    public static void closeConnection() {
        try {
            con.close();
            log.info("DB conn closed");
        }
        catch(SQLException e) {
            log.error("Error at closing" + e.getMessage());
        }
    }

    public static Connection getConnection() {
        if (con==null){
            openConnection();
        }
        else {
            try {
                if(con.isClosed()){
                    con = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/db_test","SA","");
                    log.info("DB connection re-opened.");
                }
            } catch(SQLException e){
                log.error("re-open mistake" + e.getMessage());
                return null;
            }
        }

        return con;
    }

}

これが私のクラッドクラスです:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.log4j.Logger;

public class DAOProdukt implements IDAOProdukt {

    private static final Logger log = Logger.getLogger(DAOProdukt.class);
    Connection conn;

    public DAOProdukt(){
        conn = hsqlmanager.getConnection();
    }
    //created ein Produkt p
    @Override
    public void create(Produkt p) {
        if(p==null) {           throw new IllegalArgumentException("Erstellen von null-Objekten in der DB nicht möglich");
        }
        PreparedStatement ps=null;

        try {
            ps = conn.prepareStatement("INSERT INTO Produkt(name, kategorie, delete) VALUES(?, ?, ?, ?);");
        } catch (SQLException e1) {
            log.error("Cannot establish db connection");
            e1.printStackTrace();
        }

        try {

            ps.setString(1, p.getName());
            ps.setString(2, p.getKategorie());
            ps.setBoolean(3, p.isDeleted());
            ps.execute();
            ps.close();

            log.info("Produkt created.");
        }
        catch (SQLException e) {
            log.error("Produkt couldn`t be created: " + e.toString());
        }

    }
}

コンパイラは常にcrudクラスを指し、エラーメッセージを表示します:

log.error("Cannot establish db connection");

あなたの答えにとても感謝しています!!!

PS .: そのコマンドでサーバーを実行します: java -classpath lib/hsqldb.jar org.hsqldb.server.Server --database.0 file:hsqldb/hemrajdb --dbname.0 db_test

4

1 に答える 1

0

jdbc:hsqldb:hsql://localhost/db_test接続を試行する前に、HSQLDB サーバーを起動して、URL でデータベースを提供する必要があります。

ガイドを参照してください:

http://hsqldb.org/doc/2.0/guide/running-chapt.html#rgc_server_modes

サーバーを起動したことをコメントします。したがって、私はあなたのコードをより詳しく調べました。ここに問題があります:

    try {
        ps = conn.prepareStatement("INSERT INTO Produkt(name, kategorie, delete) VALUES(?, ?, ?, ?);");
    } catch (SQLException e1) {
        log.error("Cannot establish db connection");
        e1.printStackTrace();
    }

例外をキャッチしたら、例外メッセージをログに記録する必要があります。ログに記録する固定メッセージは正しくない可能性があります。

INSERT ステートメントを見ると、3 つの列がリストされていますが、4 つのパラメーターが値として示されています。HSQLDB は、情報メッセージとともに例外をスローします。ただし、コードはメッセージを無視し、代わりに独自の誤ったメッセージを出力します。

于 2012-09-25T18:09:58.800 に答える