2015-12-31 3 views
0

Я хочу, чтобы моя программа выводила таблицу TRANSACTION, используя JTable, и появляется окно, но таблицы нет.Пользовательский интерфейс в JDBC - Просмотр таблицы

Эта часть была решена
SQL исключение occuredjava.sql.SQLException: Не удалось преобразовать внутреннее представление
SQL исключения occuredjava.sql.SQLException: Не удалось преобразовать внутреннее представление

Мой код:

import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 
import java.awt.event.ActionListener; 

import java.sql.* ; 
import java.sql.SQLException; 

public class ShowTransaction extends JFrame implements ActionListener{ 
    final JButton mainMenuButton = new JButton("Main Menu"); 

    static ShowTransaction show = new ShowTransaction(); 

    public ShowTransaction(){ 
     super("Show Transactions"); 
     setLayout(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainMenuButton.setName("main"); 


     try{ 
      Connection con = DriverManager.getConnection("jdbc:oracle:thin:@VAIO:49160:xe","mariel","1234"); 
      Statement stmt = con.createStatement(); 
      ResultSet rs = stmt.executeQuery("SELECT * FROM transaction"); 
      while (rs.next()) { 
       Object[][] data = { 
        {rs.getInt("trans_num"), rs.getInt("trans_custnum"), rs.getInt("trans_payment"), rs.getString("trans_paymentdesc"), rs.getString("trans_cust_credcard"), rs.getInt("trans_change")} 
       }; 
       String[] headers = {"Transaction Number", "Customer Number", "Payment", "Method of Payment", "Credit Card", "Change"}; 

       JTable table = new JTable(data, headers); 
       JFrame frame = new JFrame(); 
       Container contentPane = frame.getContentPane(); 
       contentPane.setLayout(new BorderLayout()); 
       contentPane.add(new JScrollPane(table), BorderLayout.CENTER); 
       contentPane.add(mainMenuButton, BorderLayout.SOUTH); 

       pack(); 
      } 
     } 
     catch(SQLException e){ 
      System.out.println("SQL exception occured" + e); 
     } 

     mainMenuButton.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e){ 
     if(mainMenuButton.getName().equals(((Component)e.getSource()).getName())){ 
      AdminMode admin = new AdminMode(); 
      admin.setVisible(true); 
      admin.setResizable(false); 
      admin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      admin.setSize(400,300); 
      this.setVisible(false); 
     } 
    } 

    public static void main(String args[]){ 
     new ShowTransaction().setVisible(true); 
    } 
} 

EDIT: TRANSACTION таблица в моем разработчика SQL, как this.

+0

Как выглядит таблица транзакций? – Todd

+3

Использование SQL-слов в качестве имен таблиц или столбцов - очень плохая идея. Вы должны разложить эту проблему, чтобы классы пользовательского интерфейса и базы данных были раздельными. Получить доступ к базе данных отлично, а затем выйти замуж за нее с помощью пользовательского интерфейса. Вы не закрываете ни один из ваших классов SQL, что тоже очень плохо. Ложно ошибается с этим кодом. – duffymo

+0

Дикая догадка: измените 'rs.getInt (" trans_paymentdesc ")' на 'rs.getString (" trans_paymentdesc ")'; –

ответ

3

Я бы рекомендовал переименовать эту таблицу в CustomerTransaction; ничего, кроме Oracle keyword transaction.

Начните с простым интерфейсом Java:

package dao; 

public interface CustomerTransactionDao { 
    List<CustomerTransaction> find(); 
} 

Тогда есть класс реализации:

package dao; 

public class CustomerTransactionDaoImpl implements CustomerTransactionDao { 

    // Think about column and table names. They should be descriptive. No need for "trans_; you know they're in the customer transaction table already. 
    private static final String BASE_SELECT_SQL = "select id, customerId, paymentAmount, paymentDescription, creditCardNumber, change from customerTransaction "; 

    public List<CustomerTransaction> find() { 
     List<CustomerTransaction> customerTransactions = new ArrayList<CustomerTransaction>(); 
     PreparedStatement ps = null; 
     ResultSet rs = null; 
     try { 
      // Query and mapping logic here. 
     } catch (Exception e) { 
      throw new RuntimeException("Database access error", e); 
     } finally { 
      // close your resources in individual try/catch blocks inside the method. 
      DatabaseUtils.close(rs); 
      DatabaseUtils.close(ps); 
     } 
     return customerTransactions; 
    } 
} 
+0

'List find();' errors, но я добавил import 'java.util.List ;, но все еще ошибки в' CustomerTransaction' в 'List find();' – Meryel

+1

Это не близко к завершению , Это скелет, который будет сложен. Я не компилировал и не запускал его. Это пример, чтобы привести нового программиста по пути. Не предназначен для производственного кода. Вы должны прочитать его, понять, и добавить в бит, которые я намеренно упустил, чтобы вы могли чему-то научиться. – duffymo

+0

Ницца. Вы также можете использовать try-with-resources для упрощения обработки инструкций и результатов. –

1

Не создавать новый 2D массива в цикле. У вас будут только данные для последней строки из ResultSet, которую вы читаете.

Вместо этого логика должна быть что-то вроде:

String[] headers = {"Transaction Number", "Customer Number", .. }; 
DefaultTableModel model = new DefaultTableModel(headers, 0); 

while (rs.next()) 
{ 
    Vector<Object> row = new Vector<Object>(columns); 

    for (int i = 1; i <= columns; i++) 
    { 
     row.addElement(rs.getObject(i)); 
    } 

    data.addElement(row); 
} 

rs.close(); 
stmt.close(); 
connection.close(); 

JTable table = new JTable(model); 

Приведенный выше код начинается с пустой TableModel с только заголовки столбцов. Затем он добавляет данные для каждой строки в ResultSet.

Если вы хотите создать пользовательский объект для своего клиентского взаимодействия, вам также необходимо создать пользовательскую таблицуModel. Обратитесь к Row Table Model за подход, который показывает, как это можно сделать.

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