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

سؤال عن الجافا والداتا بيز

مغلق
بدأه sharkia في 1 يناير 2007 · 7 رد · 930 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام عليكم ورحمة الله وبركاته..

أعمل حاليا فى مشروع لادارة صيدلية..وتم ربطة بالداتا بيز..وربطت الجافا بالأكسس.

وبالتالى يمكن للمستخدم ادخال بيانات فى قاعدة البينات وتعديلها وحذفها عن طريق الجافا..

لكن المشكلة التى تواجهنى هى البطء عن التعامل بين الجافا والداتا بيز..

فمثلا عن كتابية بيانات record والضغط على save فان البرنامج يستغرق وقت حتى يتم الاتصال مع الداتا بيز وادخال ال record (حوالى من 5 إلى 10 ثواني)

فهل هذا طبيعى..وهل عملية الاتصال بين الجافا والداتا بيز تحتاج لهذا الوقت...

وهل يوجد طريقة لتسريع هذه العملية؟؟؟؟..

وشكرا

#2

5 - 10 ثواني فترة طويلة جداً .. ما هو الكود الذي تستخدمينه للاتصال بال DB؟

فحنوت ألثم جرحه الرعافَ فانتكأت جراحي..

وهمت على خدي الدموع فقلت يا روحي وراحي..

هلّا رحمتَ قلوبنا .. وعدلت عن هذا الرّواحِ ِ ..؟

فأجابني البطل المسجّى هازئاً بيَ .. باقتراحي

كفكف دموعك ليس في عبراتك الحرّى ارتياحي

هذي سبيلي .. إن صدقت محبتي .. فاحمل سلاحي

Sun Certified Java Programmer

#3

انصحك بانشاء اتصال واحد مع الداتا بيز و ليس في كل مرة تريد أن تنفذ أمر ...

أرجو ارفاق الكود لكي نستطيع مساعدتك

بالتوفيق

SCJP 5.0

#4

السلام عليكم..

فى التطبيق الذى صممته..

يوجد مجموعة من الclasses

فيوجد class لعمل insert واخر لعمل update واخر لعمل delete

وذلك لان كل class يمثل window مختلفة

لهذا كان لابد من انشاء الاتصال فى كل كلاس

وما يستغرق الوقت عندى هو ارسال ال sql query الى الاكسس والعودة بالنتيجة..

فمثلا عملية الـ insert تاخذ وقت اقل نسبيا من عملية استعادة كل البيانات الموجودة فى قاعدة البيانات والضرورية لعمل update فى أحد الـ records

أما عن الكود..

فهذا هو الكود لأحد الـ classes المستخدمة وهو الكود لعملية استعادة البينات من احد الجدوال وعرضها فى جدول

import java.sql.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class TableDisplay extends JFrame {
private Connection connection;
private JTable table;
public TableDisplay()
{

String url = "jdbc:odbc:Books";
String username = "anonymous";
String password = "guest";

try {
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
connection = DriverManager.getConnection(
url, username, password );
}
catch ( ClassNotFoundException cnfex ) {
System.err.println(
"Failed to load JDBC/ODBC driver." );
cnfex.printStackTrace();
System.exit( 1 ); }
catch ( SQLException sqlex ) {
System.err.println( "Unable to connect" );
sqlex.printStackTrace();
}
getTable();
setSize( 450, 150 );
show();
}
private void getTable()
{
Statement statement;
ResultSet resultSet;
try {
String query = "SELECT * FROM Author";
statement = connection.createStatement();
resultSet = statement.executeQuery( query );
displayResultSet( resultSet );
statement.close();
}
catch ( SQLException sqlex ) {
sqlex.printStackTrace();
}
}
private void displayResultSet( ResultSet rs )
throws SQLException
{

boolean moreRecords = rs.next();

if ( ! moreRecords ) {
JOptionPane.showMessageDialog( this,
"ResultSet contained no records" );
setTitle( "No records to display" );
return;
}
setTitle( "Authors table from Books" );
Vector columnHeads = new Vector();
Vector rows = new Vector();
try {

ResultSetMetaData rsmd = rs.getMetaData();
for ( int i = 1; i <= rsmd.getColumnCount(); ++i )
columnHeads.addElement( rsmd.getColumnName( i ) );

do {
rows.addElement( getNextRow( rs, rsmd ) );
} while ( rs.next() );

table = new JTable( rows, columnHeads );
JScrollPane scroller = new JScrollPane( table );
getContentPane().add(
scroller, BorderLayout.CENTER );
validate();
}
catch ( SQLException sqlex ) {
sqlex.printStackTrace();
}
}
private Vector getNextRow( ResultSet rs,
ResultSetMetaData rsmd )
throws SQLException
{
Vector currentRow = new Vector();
for ( int i = 1; i <= rsmd.getColumnCount(); ++i )
switch( rsmd.getColumnType( i ) ) {
case Types.VARCHAR:
currentRow.addElement( rs.getString( i ) );
break;
case Types.INTEGER:
currentRow.addElement(
new Long( rs.getLong( i ) ) );
break;
default:
System.out.println( "Type was: " +
rsmd.getColumnTypeName( i ) );
}
return currentRow;
}
public void shutDown()
{
try {
connection.close();
}
catch ( SQLException sqlex ) {
System.err.println( "Unable to disconnect" );
sqlex.printStackTrace();
}
}
public static void main( String args[] )
{
final TableDisplay app = new TableDisplay();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
app.shutDown();
System.exit( 0 );
}
}}}
#5

اخي هذا الكود مفيد إذا لم اكن اعرف اي شي عن بنية قاعدة البيانات،

حبذا لو ذكرت شئ عن الجداول في قاعدة البيانات ( الاعمدة وما شابه ) .

#6

اخوي انت في method getNextRow هي الي فهمتوا هي المسؤله عن عملية اضافه في الدتا بيز صح

؟؟؟

اذا كان هيه الي مسؤله عن الاضافه فا انا بحكي انوا مالها داعي هي القصه كلها ؟؟

لانوا انت بتقدر تستخدم PrepareStatement بدون ResultSet ؟؟ او MetaDataResultSet

اخوا هيه بكل بساطه انا بفل انوا الواحد يعمل لكل table في database كلاسين الاول الي هوه Entity والثاني Manage الاول بكون فيه attribute تبعت Databse وبكون لكل attribute two method الي همه seter and geter

والكلاس الثاني بكون فيوا كل العملياات تبعت insert and update and delete

وinsert بتكون

  
String inseart =" INSERT INTO table_name VALUES(?,?,?,......,?); " 
stmt=con.prepareStatement(inseart);
stmt.setString(1,anything);
stmt.setInt(2,anything);
..........
.......
stmt.executeUpdate();

هي الطريقه اسهل من الي انت كنت عملها وراح تكون اسرع efficency اكثر

:) ياريت اذا كان في اشي مش واضح تقولي علشان اقدر افيدك بزياده :)

وشكرا

#7
javaskills كتب:
اخوي انت في method getNextRow هي الي فهمتوا هي المسؤله عن عملية اضافه في الدتا بيز صح

؟؟؟

اذا كان هيه الي مسؤله عن الاضافه فا انا بحكي انوا مالها داعي هي القصه كلها ؟؟

لانوا انت بتقدر تستخدم PrepareStatement بدون ResultSet ؟؟ او MetaDataResultSet

اخوا هيه بكل بساطه انا بفل انوا الواحد يعمل لكل table في database كلاسين الاول الي هوه Entity والثاني Manage الاول بكون فيه attribute تبعت Databse وبكون لكل attribute two method الي همه seter and geter

والكلاس الثاني بكون فيوا كل العملياات تبعت insert and update and delete

وinsert بتكون

  
String inseart =" INSERT INTO table_name VALUES(?,?,?,......,?); " 
stmt=con.prepareStatement(inseart);
stmt.setString(1,anything);
stmt.setInt(2,anything);
..........
.......
stmt.executeUpdate();

هي الطريقه اسهل من الي انت كنت عملها وراح تكون اسرع efficency اكثر

:) ياريت اذا كان في اشي مش واضح تقولي علشان اقدر افيدك بزياده :)

وشكرا

أخى الكريم

شكرا على ردك

لكن getNextRow تقوم باستعادة المعلومات من الداتا بيز من result set واضافتها فى الجدول لدينا قى الجافا....

ولكن سؤالى اخى..

هل فعلا يمكن ان استعيد بيانات من الداتا بيز بدون استخدام result set؟؟؟

ارجو المزيد من التوضيح عن هذه الـ classes التى ذكرتها... لو لم يكن في هذا مشقة لك

شكرا لك...

#8

انا مش فاهم هوه سؤالك عن database واسترجاع البينات منها انوا بكون بطئ ولا سريع

على كلن

انا الي بعرفوا انوا ما بتقدر تجيب من الداتا بيز غبر عن

طريق ResultSet or ResultSetMetaData وهاي شغله على ما اعتد ما بختلفوا فيها اثنين

بس على فكره ناس بستخ\موا ResultSetMetaData لما ما يكوني بدهم يرجعوا الجدول كامل بدون ما يكون عارفين اسم attribute تبعت الجدول result الي بدوا يرجع بيانات معينه من اعمده معينه

:)

ياريت اكون فدتك وشكرا

هذا الموضوع مغلق.

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