PDA

View Full Version : صفحه بندی دیتابیس در جاوا



cnmeysam
دوشنبه 06 شهریور 1396, 00:40 صبح
سلام و خسته نباشید و ممنون از وقتی که میذارید و راهنمایی میکنید
طبق معمول من تازه کار و سوال شاید پیش پا افتاده
من یه قطعه کد نوشتم برای صفحه بندی دیتابیس که با ترکیب چند تا قطعه کد به برنامه گفتم هرباز 10 خط از دیتابیس رو فراخوانی کنه
با زدن دکمه بعدی باز بره 10 خط بعدی رو لود کنه
هر بار فقط 10 خط فراخوانی میشه و نمایش داده میشه حالا چه دکمه بعدی رو کاربر بزنه میره 10 خط بعدی و یا دکه قیلی رو بزنه بر میگرده 10 خط قبلی رو نمایش میده خواستم با این کار از ترافیکی که توی شبکه میاد جلوگیری کنم
برنامه کاملا درست کار میکنه و مشکلی با این نوع صفحه بندی ندارم
ولی توی لاگ برنامه کلی ارور نشون میده که نمیفهمم علت این ارورها چیه
قطعه کدی که ارور میده این هستش



private void paging_Table() {
if (Clas.classpaging.connect_to_db()) {
if (Clas.classpaging.query_to_db("SELECT COUNT(*) AS rowcount FROM tbl_patient")) {
try {
ResultSet res_temp = Clas.classpaging.getResultSet();
res_temp.next();
double m = res_temp.getInt("rowcount");
res_temp.close();
m = m / 10;
lblall.setText(String.valueOf(Math.ceil(m)));


} catch (Exception ex) {
Logger.getLogger(this.getName()).log(Level.SEVERE, null, ex);
}
}


}


}



و ارورهایی که میده اینها هستن:



Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.util.Hashtable.get(Hashtable.java:363)
at java.util.logging.LogManager$LoggerContext.findLog ger(LogManager.java:693)
at java.util.logging.LogManager.getLogger(LogManager. java:1226)
at java.util.logging.LogManager.demandLogger(LogManag er.java:551)
at java.util.logging.Logger.demandLogger(Logger.java: 455)
at java.util.logging.Logger.getLogger(Logger.java:502 )
at PI.patient.paging_Table(patient.java:736)
at PI.patient.empty(patient.java:782)
at PI.patient.btnnewActionPerformed(patient.java:1074 )
at PI.patient.access$1200(patient.java:21)
at PI.patient$12.actionPerformed(patient.java:390)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.jav a:6533)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3324)
at java.awt.Component.processEvent(Component.java:629 8)
at java.awt.Container.processEvent(Container.java:223 6)
at java.awt.Component.dispatchEventImpl(Component.jav a:4889)
at java.awt.Container.dispatchEventImpl(Container.jav a:2294)
at java.awt.Component.dispatchEvent(Component.java:47 11)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:4466)
at java.awt.Container.dispatchEventImpl(Container.jav a:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2746 )
at java.awt.Component.dispatchEvent(Component.java:47 11)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.j ava:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessI mpl.doIntersectionPrivilege(ProtectionDomain.java: 80)
at java.security.ProtectionDomain$JavaSecurityAccessI mpl.doIntersectionPrivilege(ProtectionDomain.java: 90)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessI mpl.doIntersectionPrivilege(ProtectionDomain.java: 80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 728)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:82)





وقتی به catch این رو اضافه میکنم


JOptionPane.showMessageDialog(null, ex.getMessage());


این پیغام رو میده
146154
میشه لطفا بگید دلیل این ارورها چیه و چطوری باید برطرفشون کنم؟
البته همونطور که گفتم با وجود این ارورها برنامه کاملا درست کار میکنه ولی میخوام یاد بگیرم و برنامم بدون اشکال اجرا بشه و کار کنه باز هم ممنون

vahid-p
دوشنبه 06 شهریور 1396, 11:30 صبح
کد قبلی که داده بودید هم این مشکل رو داشت. رو یه سطر از جدول که برای دفعه اول کلیک میکردی اررور میداد و دفعه بعد مشکلی نداشت. مثل اینکه index خط انتخاب شده رو -1 میزد یا همچین چیزی که منم نفهمیدم مشکلش از کجاست.
باید ببینید دقیقا کدوم خط اررور میده (احتمالا طبق خطا کلاسی که خودت نوشتی یا اون حول و حوش باشه at PI.patient.paging_Table(patient.java:736) ) و اون خط و چند خط قبلشو breakpoint بذارید و دیباگ کنید دقیقا ببینید این null از کجا میاد. طریقه دیباگ کردن در IDE مورد استفادتون رو سرچ کنید ترجیحا ویدیویی ببینید چجوریه. کلا راهکار سرراستی نداره و باید با سعی و تلاش پیداش کنید

cnmeysam
دوشنبه 06 شهریور 1396, 11:46 صبح
این کلاسیه که برای صفحه بندی تعریف کردم



package Clas;




import java.sql.*;
import java.io.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;




public class classpaging {

public static Connection con = null;
public static Statement stmt = null;
public static ResultSet resSet = null;
public static String url = null;

public static ResultSet getResultSet()
{
return resSet;
}

public static Connection getcoConnection()
{
return con;
}

public static boolean connect_to_db()
{

try
{
FileReader reader = new FileReader("Miscsied.dll");
BufferedReader bfr = new BufferedReader(reader);
String line;
while ((line = bfr.readLine())!=null)
{
System.out.println(line);
url = line;
}
reader.close();
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection(url);
return true;
}
catch (Exception e)
{
JOptionPane.showMessageDialog(null, e.getMessage());
return false;
}
}

public static boolean query_to_db( String _query)
{
try
{
stmt = con.createStatement();
resSet = stmt.executeQuery(_query);
if (resSet.next())
{
return true;
}
else
{
return false;
}

}
catch (Exception e)
{

JOptionPane.showMessageDialog(null, e.getMessage());
return false;
}

}




}

cnmeysam
دوشنبه 06 شهریور 1396, 23:19 عصر
کد قبلی که داده بودید هم این مشکل رو داشت. رو یه سطر از جدول که برای دفعه اول کلیک میکردی اررور میداد و دفعه بعد مشکلی نداشت. مثل اینکه index خط انتخاب شده رو -1 میزد یا همچین چیزی که منم نفهمیدم مشکلش از کجاست.
باید ببینید دقیقا کدوم خط اررور میده (احتمالا طبق خطا کلاسی که خودت نوشتی یا اون حول و حوش باشه at PI.patient.paging_Table(patient.java:736) ) و اون خط و چند خط قبلشو breakpoint بذارید و دیباگ کنید دقیقا ببینید این null از کجا میاد. طریقه دیباگ کردن در IDE مورد استفادتون رو سرچ کنید ترجیحا ویدیویی ببینید چجوریه. کلا راهکار سرراستی نداره و باید با سعی و تلاش پیداش کنید

شرمنده خیلی گشتم نتونستم اشکال رو برطرف کنم میشه شما هم یک بار چک کنید شاید اشکال رو بتونیم برطرف کنیم ممنون از وقتی که می گذارید

cnmeysam
دوشنبه 06 شهریور 1396, 23:42 عصر
فکر کنم حل شد
میشه شما هم چک کنید

کد این شکلی شد:



private void paging_Table() {
if (Clas.classpaging.connect_to_db()) {
if (Clas.classpaging.query_to_db("SELECT COUNT(*) AS rowcount FROM tbl_patient")) {
try {
ResultSet res_temp = Clas.classpaging.getResultSet();
if (res_temp.next()){
double m = res_temp.getInt("rowcount");
res_temp.close();
m = m / 10;
lblall.setText(String.valueOf(Math.ceil(m)));
}
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, ex.getMessage());
Logger.getLogger(this.getName()).log(Level.SEVERE, null, ex);
}
}


}


}



برای قسمت result یک شرط گذاشتم الان برنام کار میکنه ارور نمیده خطا هم نمیگیره ولی از درست بودن کد اطمینان ندارم



if (res_temp.next()){

.
.
.
}

vahid-p
سه شنبه 07 شهریور 1396, 01:04 صبح
از درست بودن کد هیچ وقت نمیشه اطمینان حاصل کرد. برای همین هم همیشه نرم افزارها باگها رو رفع میکنن و باز باگ های جدید پیدا میشه.
اینکه کد چقدر تر و تمیز نوشته شده باشه به تجربه و هنر برنامه نویس بر میگرده و شما هم از خودتون نباید این انتظار رو داشته باشید اولین تجربتون بی نقص باشه.

همچنین دیباگ کردن بعضی وقتا از سختترین کارهای ممکنه چون لزوما جایی که خطا میده محل اشتباه برنامه نویس نیست و ممکنه یه جا دیگه کد رو اشتباه نوشته باشید و اثر رو جای دیگه ببینید. همچنین خودتون چون کد رو نوشتید بهتر میفهمید کجاها امکان اشتباه هست، من نمیتونم کل کدتون رو بخونم!

در کل همین که مشکل حل شده خوبه. فقط اگر میبینید دوبار کلیک میکنید تا نتیجه نشون بده، دلیلش اینه دفعه اول res_temp.next مقدار false داره و دفعه دوم true. با اینکه خطا نمیده ولی باز هم عملکرد مطلوبی نیست که دوبار کلیک کنید و بعد نتیجه نمایش داده بشه. نمیدونم این مشکل رو داره یا نه، فقط چون قبلا برنامتون رو اجرا کرده بودم گفتم. اگر این مشکل هنوز هم داره و فقط خطا پرینت نمیشه، همونطور که گفتم محل اشتباه یه جای دیگست که به UI ربط داره احتمالا، ولی اینجا خودش رو نشون میده.

به هر حال این برنامه نمیتونه در عمل استفاده بشه چون یکم که گسترده تر بشه به مشکلات خیلی بیشتری بر میخوره، چون ساختارش منظم نیست (از رو این چند خط کد نمیگم). ولی تمرین همینه دیگه!

cnmeysam
سه شنبه 07 شهریور 1396, 02:01 صبح
خوشبختانه برنامه با همون کلیک اول کار میکنه و نیازی به 2بار کلیک نداره تا الان تونستم تمامی ارورها رو فیکس کنم البته به لطف راهنمایی و کمکهای شما
در مورد نظم داشتن هم چون اولین کارمه و تمرینه کم کم دستم راه میوفته فقط مشکل اینجاست کسی که بلد باشه نمیشناسم و راهنمایی هایی که بهم میشه توی همین انجمن ها و سوال جوابهاست
شاید دیر دستم راه بیوفته ولی خوبیش اینه چون سخت یاد میگیرم درست یاد میگیرم و راحت فراموش نمیکنم
باز ممنون از راهنماییهاتون و وقتی که میذارید و تجربیاتتون رو باهام به اشتراک گذاشتین:قلب: