2016-12-02 10 views
0

私はAccessデータベースの統合を含むJavaプログラムを開発しています。このプログラムの目的は、マリーナで駐車場やサービスについていくことです。サービスセクションの項目リスナーは、一連のforループで、すべての単一のサービスを単独でリストする必要から時間を節約します。ただし、データベースを更新するにはこれらの結果が必要です。プログラムのGUIを使用しているときに変更が加えられておらず、選択したテーブルでAccessデータベースが更新されません。私は、GUIがアクティブで、私が行ったときにデータベースが実行されるときに、チェックボックスから1つのオプションを選択します。 2番目のチェックボックスを選択すると、選択した内容に関係なく例外エラーが発生します。プログラムやデータベースを変更する必要がありますが、どのように対処するかわかりません。私のコードは以下の通りです。複数のforループ内でSQLクエリを実行するにはどうすればよいですか?

package marinaProject; 

/** Services, repairs, and provisions that are provided at a marina. 
* @author Chris Cardenas 
*/ 

import javax.swing.*; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.awt.*; 
import java.awt.event.*; 
import java.sql.ResultSet; 
import java.util.Arrays; 
import java.util.Random; 
import java.sql.*; 
import javax.swing.border.*; 
import java.sql.SQLException; 

import java.sql.Statement; 

public class Services extends JFrame { 

static final String DATABASE_URL = "jdbc:ucanaccess://V:/Desktop/MarinaFinal.accdb"; 
Connection connection = null; 
Statement statement = null; 
ResultSet result = null; 

JTabbedPane tabbedPane = new JTabbedPane(); 

private JPanel mainPanel = new JPanel(), 
     buttonPanel = new JPanel(), 
     servicesPanel = new JPanel(), 
     repairsPanel = new JPanel(), 
     provisionsPanel = new JPanel(); 

private final int NSERVICES = 6; 
private final int NREPAIRS = 4; 
private final int NPROVISIONS = 5; 

private JCheckBox servicesPackages[] = new JCheckBox[NSERVICES]; 
private String servicePackageLabels[] = {"Fuel \n", "Water \n", "Waste \n", "Paint \n", "Winter \n", "Charging \n"}; 
private double servicePrice[] = {4, 3, 4, 7, 10, 0}; 
String serviceDbStatement; 

private JCheckBox repairsPackages[] = new JCheckBox[NREPAIRS]; 
private String repairPackageLabels[] = {"Mechanical \n", "Electrical \n", "Communication \n", "Navigation \n"}; 
private double repairPrice[] = {100, 212, 100, 150}; 
String repairsDbStatement; 

private JCheckBox provisionsPackages[] = new JCheckBox[NPROVISIONS]; 
private String provisionPackageLabels[] = {"Ice \n", "First Aid Kit \n", "Chips \n", "Popcorn \n", "Soda \n"}; 
private double provisionsPrice[] = {5, 10, 3, 2, 2}; 
String provisionsDbStatement; 

private double totalBill; 
private String servicesPrinted[] = new String[6]; 
private String repairsPrinted[] = new String[4]; 
private String provisionsPrinted[] = new String[5]; 
private double servicesPricesPrinted[] = new double[6]; 
private double repairsPricesPrinted[] = new double[4]; 
private double provisionsPricesPrinted[] = new double[5]; 
private int serviceNumber = 0; 
private double boatID = 12345; 

private JButton doneButton = new JButton("Done"); 

public Services() { 
    setTitle("Services"); 

    mainPanel.setLayout(new GridLayout(2, 1, 1, 1)); 

    doneButton.addActionListener(new ActionListen()); 
    buttonPanel.add(doneButton); 

    servicesPanel.setLayout(new BoxLayout(servicesPanel, BoxLayout.Y_AXIS)); 
    servicesPanel.setBorder(new TitledBorder("Services")); 

    for (int i = 0; i < servicesPackages.length; i++) { 
     servicesPackages[i] = new JCheckBox(servicePackageLabels[i]); 
     servicesPanel.add(servicesPackages[i]); 
     servicesPackages[i].addItemListener(new ItemListen()); 
    } 
    tabbedPane.addTab("Services", null, servicesPanel, "Services Information"); 

    repairsPanel.setLayout(new BoxLayout(repairsPanel, BoxLayout.Y_AXIS)); 
    repairsPanel.setBorder(new TitledBorder("Repairs")); 

    for (int i = 0; i < repairsPackages.length; i++) { 
     repairsPackages[i] = new JCheckBox(repairPackageLabels[i]); 
     repairsPanel.add(repairsPackages[i]); 
     repairsPackages[i].addItemListener(new ItemListen()); 
    } 
    tabbedPane.addTab("Repairs", null, repairsPanel, "Repairs Information"); 

    provisionsPanel.setLayout(new BoxLayout(provisionsPanel, BoxLayout.Y_AXIS)); 
    provisionsPanel.setBorder(new TitledBorder("Provisions")); 

    for (int i = 0; i < provisionsPackages.length; i++) { 
     provisionsPackages[i] = new JCheckBox(provisionPackageLabels[i]); 
     provisionsPanel.add(provisionsPackages[i]); 
     provisionsPackages[i].addItemListener(new ItemListen()); 
    } 
    tabbedPane.addTab("Provisions", null, provisionsPanel, "Provisions Information"); 

    tabbedPane.setTabPlacement(SwingConstants.LEFT); 
    mainPanel.add(tabbedPane); 
    mainPanel.add(buttonPanel); 
    add(mainPanel); 

    Random rand = new Random(); 

    serviceNumber = rand.nextInt(5000) + 1; 
} 

private class ItemListen implements ItemListener { 

    public void itemStateChanged(ItemEvent event) { 
     totalBill = 0; 
     for (int i = 0; i < servicesPackages.length; i++) { 
      if (servicesPackages[i].isSelected()) { 
       totalBill += servicePrice[i]; 
       servicesPrinted[i] = servicePackageLabels[i]; 
       servicesPricesPrinted[i] = servicePrice[i]; 
       ResultSet serviceDbResult = null; 
       String servicesQuery; 
      } 
     } 

     for (int i = 0; i < repairsPackages.length; i++) { 
      if (repairsPackages[i].isSelected()) { 
       totalBill += repairPrice[i]; 
       repairsPrinted[i] = repairPackageLabels[i]; 
       repairsPricesPrinted[i] = repairPrice[i]; 
       ResultSet repairsDbResult = null; 
       String repairssQuery; 
      } 
     } 

     for (int i = 0; i < provisionsPackages.length; i++) { 
      if (provisionsPackages[i].isSelected()) { 
       totalBill += provisionsPrice[i]; 
       provisionsPrinted[i] = provisionPackageLabels[i]; 
       provisionsPricesPrinted[i] = provisionsPrice[i]; 
       ResultSet provisionsDbResult = null; 
       String provisionsQuery; 
       String DATABASE_URL = "jdbc:ucanaccess://V:/Desktop/MarinaFinal.accdb"; 
      } 
     } 

     String DATABASE_URL = "jdbc:ucanaccess://V:/Desktop/MarinaFinal.accdb"; 
     try { 
      { 
       //establish connection to database 
       connection = DriverManager.getConnection(DATABASE_URL); 
       System.out.println("Made a connection"); 

       //create Statement for querying database 
       statement = connection.createStatement(); 
       System.out.println("Established statement"); 

       //SQL Query 
       String sql = "INSERT INTO Services (serviceNumber, boatID, repairMech, repairElectro, serviceWater, serviceWaste, serviceWinter," 
         + "serviceCharging, servicePaint, serviceFuel, repairCommunication, repairNavigation, provisionIce" 
         + "provisionFirstAid, provisionChips, provisionPopcorn, provisionSoda, slipNumber, billNumber)" 
         + "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; 

       // TEMPORARY VARIABLES 
       int slipNumTEMP = 4; 
       int billnumTEMP = 454; 

       PreparedStatement ps1 = connection.prepareStatement(sql); 

       ps1.setDouble(1, serviceNumber); 
       ps1.setDouble(2, boatID); 
       ps1.setDouble(3, servicePrice[0]); 
       ps1.setDouble(4, servicePrice[1]); 
       ps1.setDouble(5, servicePrice[2]); 
       ps1.setDouble(6, servicePrice[3]); 
       ps1.setDouble(7, servicePrice[4]); 
       ps1.setDouble(8, servicePrice[5]); 
       ps1.setDouble(9, repairPrice[0]); 
       ps1.setDouble(10, repairPrice[1]); 
       ps1.setDouble(11, repairPrice[2]); 
       ps1.setDouble(12, repairPrice[3]); 
       ps1.setDouble(13, provisionsPrice[0]); 
       ps1.setDouble(14, provisionsPrice[1]); 
       ps1.setDouble(15, provisionsPrice[2]); 
       ps1.setDouble(16, provisionsPrice[3]); 
       ps1.setDouble(17, provisionsPrice[4]); 
       ps1.setDouble(18, slipNumTEMP); 
       ps1.setDouble(19, billnumTEMP); 

       // Execute Query 
       int rs = ps1.executeUpdate(); 
       if (rs == 1) { 
        System.out.println("Query executed"); 
       } else { 
        System.out.println("Not found."); 
       } 
      } 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

private class ActionListen implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 
     String label = doneButton.getText(); 

     if (e.getSource() == doneButton) { 
      if (label.equals("Done")) { 
       setVisible(false); 
       billGUI nextScreen = new billGUI(totalBill, servicesPrinted, repairsPrinted, 
         provisionsPrinted, servicesPricesPrinted, repairsPricesPrinted, 
         provisionsPricesPrinted); 
       nextScreen.setSize(400, 650); 
       nextScreen.setVisible(true); 
      } 
     } 
    } 
} 
} 

編集:以下は、サービステーブルのイメージとデータベース内の他のテーブルとの関係です。スクリーンショットは、GUIフォームを示して、あなたの問題を再現

Services table in the Design View

Relationships between the tables

+0

例外はありますか?データベーススキーマとは何ですか? – Ivan

+0

「完全性制約違反」は、例外として私が得ている答えです。 – CJC

+1

@Ivanが尋ねるように、テーブルスキーマを投稿してください。すべてのフィールドは自律番号(boatid?)、必須(null制約なし)、長さゼロ、重複インデックスなし、二重フィールド(すべてのパラメータがそのままキャストされている)などですか?これらのプロパティは、MSAccess.exeを使用してテーブルのデザインビューで確認できます。 – Parfait

答えて

1

、修正が近い読み取りに不足しているカンマで構文エラーを維持し、あなたのSQLに降りてきました。

あなたはカンマを持っていないだけで provisionIce

Java GUI Program

ので、クエリが原因改行に存在しない列に挿入しようとしprovisionIceprovisionFirstAid出力してもよい整合性制約違反いるMSACCESS.EXEで

クエリ値と宛先フィールドの数が同じではありません。

INSERT INTOステートメントに未知のフィールド名 'provisionIceprovisionFirstAid'が含まれています。

だから、単に必要なコンマを追加:

"repairCommunication, repairNavigation, provisionIce," 
----------------------------------------------------^ 
+ "provisionFirstAid, provisionChips, provisionPopcorn, provisionSoda, 

追加メモ:今のよう

  1. を、すべてのチェックボックスをクリックすると、すべてのカラムで同じ正確なデータを追加します。おそらくまだサンドボックス開発モードになっている可能性があります。
  2. 呼び出された別のメソッドでGUIプログラムを起動しているときにAccessデータベースに接続し、各チェックボックスのクリック時に接続オブジェクトを追加することを検討してください。今すぐ接続はListenerイベントで行われます。
  3. ユーザーがウィンドウを閉じたときにプログラムを正しく終了するために、ウィンドウリスナーまたはイベント(検索またはGoogle/Bingで見つかる通常のSO質問)を追加することを検討してください。
関連する問題