-2

検索テキスト フィールドを使用してデータベース内の顧客を検索できる銀行アプリケーションを作成しています (MySQL データベースを使用しています)。姓で顧客を検索するために文字を入力すると、アプリケーションはデータベースからデータを取得し、結果を JList に表示します。私の場合、データベースには合計 5 つのレコードがあり、4 つの姓は文字「S」で始まり、1 つの姓は文字「M」で始まります。行または結果が JList に表示されたら、1 つの行をクリックすると、名、姓、都市などのテキスト フィールドに適切な情報が自動的に入力されます。ただし、次の 2 つの問題があります。

  1. 私の場合、姓を文字「S」で検索すると、JList にはデータベースから 4 つのレコードしか表示されませんが、これは正しいことです。JList から 1 つの行を選択すると、すべてのテキスト フィールドに適切な情報が自動的に入力されます。ただし、JList の最初の行を選択すると、テキスト フィールドには常に JList の最後の行の情報が入力されます。JList でどの行を選択しても、テキスト フィールドは常に最後の行に情報を入力します。

  2. 文字「S」を検索すると、4 つのレコードが得られます。これは正しいです。ただし、アプリケーションがまだ実行されているときに文字「M」を検索すると、1 つのレコードが取得され、これも正しいのですが、文字「S」を再度検索しようとすると、1 つのレコードしか取得されません。なんで?4 である必要があります。

これは私が達成しようとしていることです: Bank Application link

ここに私のコードの一部があります:

    // function that will search for records in the database
    private void searchRecord(){
        try {

            connect = DriverManager.getConnection(url,user,password);
            SQLStatement = connect.createStatement();
            Class.forName("com.mysql.jdbc.Driver");
            model.clear();
            String select = "SELECT * FROM customerinfo WHERE LastName LIKE '"+ txtSearch.getText().trim() +"%'";
            rows = SQLStatement.executeQuery(select);

            while(rows.next()){
                //model.addElement(rows.getString("LastName"));
                model.addElement(rows.getString("LastName") + ", " + rows.getString("FirstName") + " " + rows.getString("MiddleInitial") + ".");
            }

            rows.close();
            SQLStatement.close();
            connect.close();
        } catch (ClassNotFoundException e) {
            JOptionPane.showMessageDialog(this, "Where is your Mysql JDBC Driver?");
            e.printStackTrace();
        } catch (SQLException e){
            JOptionPane.showMessageDialog(this, "SQLException: " + e.getMessage());
            JOptionPane.showMessageDialog(this, "VendorError: " + e.getErrorCode());
        }

    }

    // Implement Action Listener
    private class handler implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent event) {
            // if user clicks on New Customer Button, do the following...
            if(event.getSource() == newCustomer){
                checkForEmptyFields();
                insertDatabase();
                clearFields();
            } else if(event.getSource() == update){
                checkForEmptyFields();
                updateDatabase();
                clearFields();
            } else if(event.getSource() == remove){
                checkForEmptyFields();
                deleteRecord();
                clearFields();
            } else if(event.getSource() == cancel){
                clearFields();
            } else if(event.getSource() == open){

            } else if(event.getSource() == search){
                searchRecord();
            } 

        }
    }

    // function that will set the text fields
    private void setTextFields(int customerID, String firstName, String lastName, String middleInitial, String street, String city, String state, int zipCode, int phone, String email){
        String convertCustomerID = Integer.toString(customerID);
        txtCustomerID.setText(convertCustomerID);
        txtFirstName.setText(firstName);
        txtLastName.setText(lastName);
        txtMiddleInitial.setText(middleInitial);
        txtStreet.setText(street);
        txtCity.setText(city);
        txtState.setText(state);
        String convertZipCode = Integer.toString(zipCode);
        txtZip.setText(convertZipCode);
        String convertPhone = Integer.toString(phone);
        txtPhone.setText(convertPhone);
        txtEmail.setText(email);
    }

    // Implement List Selection Listener
    private class listener implements ListSelectionListener{
        @Override
        public void valueChanged(ListSelectionEvent event) {
                    try {
                        connect = DriverManager.getConnection(url,user,password);
                        SQLStatement = connect.createStatement();
                        String select = "SELECT * FROM customerinfo WHERE LastName LIKE '"+ txtSearch.getText().trim() + "%'";
                        rows = SQLStatement.executeQuery(select);

                        if(!event.getValueIsAdjusting()){

                                    while(rows.next()){
                                        setTextFields(rows.getInt("CustomerID"), rows.getString("FirstName"), rows.getString("LastName"), rows.getString("MiddleInitial"),
                                            rows.getString("Street"), rows.getString("City"), rows.getString("State"), rows.getInt("ZipCode"), rows.getInt("Phone"),
                                            rows.getString("Email"));
                                    }

                            }

                    } catch(Exception ex) {
                        JOptionPane.showMessageDialog(null, "Cannot get field values");
                    }
        }

    }

問題番号1を与えているのはrows.next()でなければなりません。rows.next()はデータベース内のすべてのレコードを通過し、すべてのレコードを通過した後、最後にとどまっているようです記録。どういうわけか、位置をリセットする必要があり、JList の行をクリックすると、同じ値を持つ行と等しくなり、すべてのテキスト フィールドに適切な情報が入力されます。

私はすべてを試しましたが、この時点であきらめました!私を助けてください!ありがとうございました!

4

1 に答える 1

0

メソッド内の SELECT ステートメントは、valueChangedすべてを再度選択します。必要なレコードのみを選択するようにする必要があります。そのため、リストに必要な行 (顧客番号など) を特定し、選択イベントに応答して単一の顧客のみを取得するときに SELECT ステートメントでそれを使用する手段が必要になります。

于 2012-05-20T20:06:07.350 に答える