2016-09-16 2 views
-2

У меня есть проект базы данных java с использованием Apache Derby. Он отлично работает на Eclipse IDE. Но после упаковки проекта в runnable JAR, программное обеспечение не может загрузить и сохранить базу данных.Упаковка проекта java с базой данных Derby от Apache

// JDBC CONNECTION METHOD 
public void connect() throws Exception{ 

    if(con != null) return; 

    try { 
     Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance(); 
    } catch (ClassNotFoundException e) { 
     throw new Exception("Driver not found"); 
    } 

    String url = "jdbc:derby:src/MyDB;create=true"; 
    con = DriverManager.getConnection(url); 
} 

//JDBC DISCONNECITON METHOD 

public void disconnect(){ 

    if(con != null){ 
     try { 
      con.close(); 
     } catch (SQLException e) { 

     } 
    } 
} 

// SAVING DATA INTO JDBC DATABASE 
public void save() throws SQLException{ 

    String checkSQL = "SELECT COUNT(*) AS Count FROM appData.stock WHERE id =? "; 
    PreparedStatement checkStmt = con.prepareStatement(checkSQL); 

    String insertSQL = "INSERT INTO appData.stock(productName,unitPrice,quantity,manufacturer,stockDate,value) VALUES(?,?,?,?,?,?)"; 
    PreparedStatement insertStmt = con.prepareStatement(insertSQL); 

    for(Product product : stock){ 
     int id = product.getId(); 
     String productName = product.getProductName(); 
     float price = product.getProductPrice(); 
     int quantity = product.getQuantity(); 
     String manufacturer = product.getManufacturer(); 
     String date = product.getDate(); 
     float value = product.getValue(); 

     checkStmt.setInt(1, id); 

     ResultSet checkResult = checkStmt.executeQuery(); 
     checkResult.next(); 

     int count =checkResult.getInt(1); 

     if(count == 0){ 
      int col = 1; 
      //insertStmt.setInt(col++, id); 
      insertStmt.setString(col++, productName); 
      insertStmt.setFloat(col++, price); 
      insertStmt.setInt(col++, quantity); 
      insertStmt.setString(col++, manufacturer); 
      insertStmt.setString(col++, date); 
      insertStmt.setFloat(col++, value); 

      insertStmt.executeUpdate(); 

     } 
    } 

    UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("Courier New",Font.PLAIN,26))); 
    JLabel message = new JLabel("Your Stock Database has been Updated and Saved"); 
    message.setFont(new Font("Courier New",Font.PLAIN,21)); 
    JOptionPane.showMessageDialog(null, message); 

    checkStmt.close(); 
    insertStmt.close(); 
} 

//RETRIEVING DATA FROM DATABASE IN JDBC 
public void load() throws SQLException{ 
    stock.clear(); 

    String sql = "SELECT * FROM appData.stock "; 

    Statement selectStatement = con.createStatement(); 

    ResultSet result = selectStatement.executeQuery(sql); 

    while(result.next()){ 
     int id = result.getInt("id"); 

     String productName = result.getString("productName"); 
     float price = result.getFloat("unitPrice"); 
     int quantity = result.getInt("quantity"); 
     String manufacturer = result.getString("manufacturer"); 
     String date = result.getString("stockDate"); 
     float value = result.getFloat("value"); 

     Product product = new Product(id,productName,quantity,price,manufacturer,date,value); 

     stock.add(product); 
    } 
} 

ответ

0

@Asaana Вы говорите, что она отлично работает в упадке, так что заставляет меня верить, что теперь вы работаете за пределами IDE, то derby.jar файл не находится в вашем пути к классам.

Попробуйте это, если вы еще не сделали этого ...

При создании файла банку, (если вы импортировать манифеста информацию), положить derby.jar в Class-Path заголовок манифеста. txt файл

Например. В вашем manifest.txt файле:

Включите эту опцию:

Class-Path [derby_home] \ Lib \ derby.jar

Где [derby_home] находится где находится ваш котелок. Это с моей головы, когда я не рядом с моим экраном. Извиняюсь.

0

@Ingrid После того, как он упакован в исполняемый файл Jar, мое программное обеспечение может найти файл derby.jar, но не сможет найти мою базу данных SCHEMA и сохраненные данные. Спасибо.

0

Хорошо, я вижу. Исправьте меня, если я ошибаюсь, но вы создали свои таблицы внутри среды IDE. Вам необходимо напрямую создавать свои таблицы из вашего приложения (как показано ниже) или через скрипт.

Далее следует пример создания базы данных, добавления таблиц и вставки данных непосредственно из приложения. базы данных (MyDB) будет создан в вашей папке проекта (папку, в которой вы запускаете приложение.)

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import javax.swing.JOptionPane; 


public class DerbyExample {  

    private Connection con = null;  
    private final String dbName = "MyDB";  
    private final String protocol = "jdbc:derby:"; 
    private PreparedStatement psInsert;  
    private Statement s; 

    public DerbyExample() throws SQLException { 
     try {     
      con = DriverManager.getConnection(protocol + dbName + ";create=true"); 
     } 
     catch (SQLException ex) { 
      con = null; 
     } 
     if (con == null) { 
      JOptionPane.showMessageDialog(null, "Could not create/connect to shop database! - Contact System Administrator.  "); 
      System.exit(1); 
     }    
     con.setAutoCommit(false);    

      s = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 

      s.execute("create table CATEGORIES(CATEGORYID int NOT NULL, CATEGORYNAME varchar(20))"); 
      s.execute("ALTER TABLE CATEGORIES ADD CONSTRAINT CATEGORYID_PK PRIMARY KEY (CATEGORYID)"); 
      psInsert = con.prepareStatement("insert into CATEGORIES values (?, ?)"); 
      psInsert.setInt(1, 1); 
      psInsert.setString(2, "Breakfast"); 
      psInsert.executeUpdate(); 
      psInsert.setInt(1, 3); 
      psInsert.setString(2, "Coffee"); 
      psInsert.executeUpdate(); 
      psInsert.setInt(1, 4); 
      psInsert.setString(2, "Dessert"); 
      psInsert.executeUpdate(); 
      con.commit(); 

      ResultSet rs = s.executeQuery("select * from CATEGORIES"); 
      rs.beforeFirst(); 
      while (rs.next()) { 
       System.out.println(rs.getInt(1)); 
       System.out.println(rs.getString(2)); 
      }    
      rs.close();   

      disconnect();   
     } 
    public void disconnect(){ 
     // Shutdown Derby 
     try { 
      DriverManager.getConnection("jdbc:derby:;shutdown=true"); 
     } catch (SQLException ex) {} 

     // Close statement (PreparedStatement extend Statement)    
     if (s != null) { 
      try { 
       s.close(); 
       s = null; 
      } catch (SQLException ex) {}   
     } 
     // Close connection 
     if(con != null){ 
      try { 
       con.close(); 
       con = null; 
      } catch (SQLException e) {} 
     }    
    } 

    public static void main(String[] args) throws SQLException { 

     DerbyExample ex = new DerbyExample();   
    } 
} 

Позвольте мне знать, если это решение решает вашу проблему. Вы можете найти много информации в Derby Reference Manual и Derby Developer's Guide и примеры here.

+0

Это сработало. Вы сохранили меня.Thankz – Asaana

+0

@Asaana Добро пожаловать. Отметьте ответ как правильный, если он ответит на ваш вопрос. Благодаря ;) – Ingrid

Смежные вопросы