الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة فى عرض بيانات من قاعدة البيانات إلى Jtable

بدأه mr.beshoy في 19 فبراير 2010 · 7 رد · 815 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هنا أقوم بكتابة code يعرض بيانات من قاعدة بينات إلى Jtable

بيظهر nullPointerexception مش عارف ايه سببه فى السطر هذا

   metaData = resultSet.getMetaData();

أنا بخمن عشان ان ال resultset ليس لها Intialization لكن فوق السطر هذا يوجد دالة setQuery() و بها intialization لل resultset إذن ما العيب ؟؟

----------------------------------------------------------------------------------------------------

الكود

------------

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import java.sql.SQLException;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class TestJtable extends JFrame {

    private JPanel mainPanel, buttonPanel;
    private JButton[] buttons;
    private final String[] BUTTONNAMES = {"showButton", "insertButton", "searchButton", "updateButton", "deletebutton"};
    private JInternalFrame internalFrame;
    private JDesktopPane desktopPane;
    private JTable table;
    private ResultTableModel tableModel;
    private JScrollPane scrollPane;
    private static final String showData = "SELECT * FROM Employee";
    private MyActionListener myActionListener;

    public TestJtable() throws ClassNotFoundException, SQLException {
        intializingPanels();
        intializingbuttons();
        tableModel = new ResultTableModel();
        table = new JTable(tableModel);
        tableModelOperations();
        scrollPane = new JScrollPane(table, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        getContentPane().add(mainPanel);
    }

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        TestJtable testJtable = new TestJtable();
        testJtable.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        testJtable.setSize(new Dimension(600, 300));
        testJtable.setLocationRelativeTo(null);
        testJtable.setVisible(true);
    }

    private void intializingPanels() {
        mainPanel = new JPanel(new BorderLayout());
        buttonPanel = new JPanel(new FlowLayout());

    }

    private void intializingbuttons() {
        myActionListener = new MyActionListener();
        buttons = new JButton[BUTTONNAMES.length];
        for (int i = 0; i < BUTTONNAMES.length; i++) {
            buttons = new JButton(BUTTONNAMES);
            buttons.addActionListener(myActionListener);
            buttonPanel.add(buttons);
            mainPanel.add(buttonPanel, BorderLayout.NORTH);
        }
    }

    private void intializingInternalDeskTop() {

        JPanel panel = new JPanel(new BorderLayout());
        panel.add(scrollPane, BorderLayout.CENTER);
        /////////////////////////////////////////////////////////////
        internalFrame = new JInternalFrame(null, true, true, true);
        internalFrame.setSize(500, 500);
        internalFrame.add(panel);
        try {
            internalFrame.setMaximum(true);
        } catch (PropertyVetoException ex) {
            ex.printStackTrace();
        }
        //////////////////////////////////////////////////////////////
        desktopPane = new JDesktopPane();
        desktopPane.setOpaque(false);
        desktopPane.setEnabled(true);
        desktopPane.add(internalFrame);
        internalFrame.setVisible(true);
        //////////////////////////////////////////////////////////////
        mainPanel.add(desktopPane, BorderLayout.CENTER);
    }

    private void tableModelOperations() throws SQLException {
        tableModel.setQuery(showData);
        tableModel.disconnectedDatabase();
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableModel);
        table.setRowSorter(sorter);
    }

    private class MyActionListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == buttons[0]) {
                intializingInternalDeskTop();

            }
        }
    }
}

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.table.AbstractTableModel;

public class ResultTableModel extends AbstractTableModel {

    private static final String DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
    private static final String DRIVER_URL = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};" +
            "Dbq=D:\\my _works\\my_works_2010\\JDBC-work\\employeedb\\Database2.mdb";
    private Connection connection;
    private Statement statement;
    private ResultSet resultSet;
    private ResultSetMetaData metaData;
    private String query;
    private int numOfRow;
    private boolean connect = false;

    public ResultTableModel() throws ClassNotFoundException, SQLException {
        Class.forName(DRIVER);
        connection = DriverManager.getConnection(DRIVER_URL);
        statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY);
        connect = true;
        if (query != null) {
            setQuery(query);
        }
        metaData = resultSet.getMetaData();
    }

    @Override
    public Class getColumnClass(int columnIndex) {
        try {
            String className = metaData.getColumnClassName(columnIndex + 1);
            return Class.forName(className);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return Object.class;
    }

    @Override
    public int getColumnCount() {
        try {
            return metaData.getColumnCount();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return 0;
    }

    @Override
    public String getColumnName(int column) {
        try {
            return metaData.getColumnName(column + 1);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return "";
    }

    public int getRowCount() {
        return numOfRow;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        try {
            resultSet.absolute(rowIndex + 1);
            return resultSet.getObject(columnIndex + 1);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return "";
    }

    public void setQuery(String query) throws SQLException {
        resultSet = statement.executeQuery(query);
        metaData = resultSet.getMetaData();
        resultSet.last();
        numOfRow = resultSet.getRow();
        fireTableStructureChanged();
    }

    public void disconnectedDatabase() throws SQLException {
        if (connect) {
            resultSet.close();
            statement.close();
            connection.close();
        }
    }
}

و هل هذه الطريقة لعرض بيانا فى JTabel سليمة .؟؟؟ لو أحد عنده طريقة أفضل يعرضها

شكراً

#2

يا حج بيشوي الكود في المرفقات والكود في الصفحة

كما أخبرتك مسبقاً قدم لي ما يسهل علي مساعدتك تجدني أساعدك

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#3

أسف مستر علاء ..أهدى علىَّ :lol:

الكود فى المرفقات و المشكلة فى أول مشاركة فوق :lol:

JTableTest.rar

تم تعديل هذه المشاركة بواسطة mr.beshoy في 19 فبراير 2010 في 17:22

#4

لم أستطع الاستفادة من الكود لأن قاعدة البيانات Access

لماذا لا تستخدم MYSQL

على كل مشكلتك تكمن في أنك يجب أن تنادي الجملة setQuery قبل أن تقوم باستخدام metadata

وكما لاحظت الجملة query لديك دائماً بـ null معنى الكلام أن المقطع التالي لن ينفذ

        if (query != null) {
            setQuery(query);
        }

بالتالي قيمة resultSet تبقى تساوي null

لهذا عندما تنفذ الجملة التالية تحصل على خطأ

metaData = resultSet.getMetaData();

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#5
اقتباس
يجب أن تنادي الجملة setQuery قبل أن تقوم باستخدام metadata

و ده الى انا عامله ...

---------------------------------

اقتباس

وكما لاحظت الجملة query لديك دائماً بـ null

أنا بقول لو != null لبس = null

و الclass ال JTableTest ممرر

private static final String showData = "SELECT * FROM Employee";

للدالة القيمة دائماً ب Null??!!!.. إذن كيف يكون

وضح اكثر مستر علاء معلش

-----------------------------------------------------------------------------

ايش الفرق بين استخدم access أو mysql الدوال واحدة و الكود واحد

أنا ملاحظ كده

و سبب إنه Access عشان أول مرة أتعامل مع ال JDBC فا قولت أبدأ بيه عشان أفهم المفاهيم كويس ثم أنتقل لل JavaDerby

شكراً

#6

أخ بيشوي query عندك تساوي null

(جرب طباعة قيمة query قبل عملية if)

بالتالي الشرط if query !=null وهذا يعني أن البرنامج لن ينفذ ما بداخل if

بالتالي فإنه لن ينفذ الدالة setQuery

setQuery هي الدالة التي تقوم بتغيير قيمة المتغير resultSet من null إلى قيمة حقيقية

وبما أن هذه الدالة لم تنفذ إذن resultSet مازالت تساوي null

وهذا يعني عندما تكتب الجملة التالية

resultSet.getMetaData();

أنك تقوم باستخدام null في محاولة لمناداة دالة فعلياً غير متوفرة لدى null

لهذا فأنت تحصل على NullPointerException

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#7

طب قولى على الطريقة لأنى تهت فيها

#8

ضع جملة sql في المتغير query

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…