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

RowSet المتصل و غير المتصل

بدأه أبو فهيد في 14 يوليو 2012 · 4 رد · 951 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

كما هو معروف أن CachedRowSet يمثل قواعد البيانات غير المتصل , وهو تحميل البيانات إلى الذاكرة

أما JdbcRowSetImpl فيمثل قواعد البيانات المتصل . وانا حاليا أتعامل مع هذا النوع , ولكن مشكلته أنه يتصرف وكأنه غير متصل !!

مثال :

import com.sun.rowset.JdbcRowSetImpl;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sql.RowSet;

/**
 *
 * @author mohand
 */
public class MainProgram {

    private static ResultSetMetaData metadata;
    private static RowSet rs;

    static final String DATABASE_URL = "jdbc:derby://localhost:1527/COLLAGE_DB";
   static final String USERNAME = "mohand";
   static final String PASSWORD = "mohand";

    public static void main (String args [])
    {
        try {

            rs = new JdbcRowSetImpl(DATABASE_URL, USERNAME, PASSWORD);
            Add_Student("UUU", "AAA", "HHHH");
            Display();
            DeleteRow(2);
            Display();

        } catch (SQLException ex) {
            Logger.getLogger(MainProgram.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void Add_Student(String s1 , String s2 , String s3) throws SQLException
    {
        System.out.println(rs.toString());

        rs.setCommand("SELECT * FROM STUDENT");
        rs.execute();
                        rs.moveToInsertRow();
                           rs.updateString(2,s1);
                           rs.updateString(3,s2);
                           rs.updateString(4,s3);
                           rs.insertRow();
                           rs.moveToCurrentRow();
                           rs.updateRow();

    }

    public static void DeleteRow(int rowNum) throws SQLException
    {

            rs.absolute(rowNum);
            rs.deleteRow();
            rs.last();
    }

    public static void Display () throws SQLException
    {
            metadata = rs.getMetaData();

             int numberOfColumns = metadata.getColumnCount();     
             System.out.println();

             for ( int i = 1; i <= numberOfColumns; i++ )
                System.out.printf( "%-8s\t", metadata.getColumnName( i ) );
             System.out.println();

             while ( rs.next() ) 
             {
                for ( int i = 1; i <= numberOfColumns; i++ )
                   System.out.printf( "%-8s\t", rs.getObject( i ) );
                System.out.println();
             } // end while
    }

}

المخرجات :

STUDENT_ID	FIRST_NAME	SECOND_NAME	MAJOR   	
65      	UUU     	AAA     	HHHH    	
71      	AAA     	BBB     	CCC     	
72      	jjj     	ccc     	bbb     	
73      	UUU     	AAA     	HHHH    	

STUDENT_ID	FIRST_NAME	SECOND_NAME	MAJOR

المشكلة هي أن بعد حذف صف . ﻻ يرجع لي بالبيانات الحالية

يجب علي إستخدام هذه الجملة في كل مرة أريد الحصول على أخر البيانات :

"SELECT * FROM STUDENT"

أليس إستخدام جملة SQL معين بشكل متكرر . يأثر في البرنامج و قواعد البيانات , وما هو الحل بنظرك

ملاحظة : بإفتراض أنك تتعامل مع قواعد بيانات كبيرة ﻻ يمكن تحميلها بالذاكرة

تم تعديل هذه المشاركة بواسطة أبو فهيد في 14 يوليو 2012 في 20:27

للصداقة البرمجية

pro-vb6@hotmail.com

#2

أليس إستخدام جملة SQL معين بشكل متكرر . يؤثر في البرنامج و قواعد البيانات , وما هو الحل بنظرك ؟

ج/ تقريبا لا يؤثر إذا كان التعامل مع قاعدة البيانات خفيف،

إذا كان هناك طلبات كثيرة جدا على قاعدة البيانات، في هذه الحالة هنا يكون مؤثر فعلا والحل هو استخدام memcached لو اضطريت الى هذه الحالة مثلا مئة اتصال على قاعدة البيانات في نفس الوقت

او موقع اخباري والناس تهجم على الموقع بالمئات يوميا،

أما مواقعنا وبرامجنا بسيطة وليس عليها ضغط كبير،

أنا صراحة اول مرة اشوف الطريقة هذي، ليش ما تستخدم الطريقة العادية

انك تتواصل مع قاعدة البيانات بـ SQL Statements ؟

#3

أهلا بك أخي بارع .

اقتباس
أنا صراحة اول مرة اشوف الطريقة هذي، ليش ما تستخدم الطريقة العادية

انك تتواصل مع قاعدة البيانات بـ SQL Statements ؟

هل تقصد بإستخدام جملة كهذا :

INSERT INTO table_name
VALUES (value1, value2, value3,...)

إن كان هذا ما تقصده ... فلا داعي لإستخدامها( إﻻ إذا كنت تستخدم ResultSet) , لأن RowSet يوفر لك أمر الحذف و الإضافة و التحديث بدون إستخدام جمل Sql بشكل مباشر . و بدون إنشاء كائن Statement .

وإن إحتجت إلى إستخدام SQL , فقط إستخدم الدالة :

rs.setCommand("SELECT * FROM STUDENT");

تم تعديل هذه المشاركة بواسطة أبو فهيد في 17 يوليو 2012 في 08:29

للصداقة البرمجية

pro-vb6@hotmail.com

#4

أعتقد أنه يجب عليك أن تجعل JDBCRowSet قابلة للتعديل updatable خصوصاً وأن الافتراضي فيها أنها غير قابلة للتحديث

أخبرني بما سيحدث معاك سوءاً سلباً أو إيجاباً

تحياتي

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

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

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

728x90.png

#5

مرحبا أخوي علاء

جميع كائنات ال rowset هي updatable بشكل إفتراضي

اقتباس

RowSet objects are scrollable and updatable unless you set different values

for those properties.

و للتأكد قمت بتغيرها بإستخدام :

rs.setConcurrency(ResultSet.CONCUR_UPDATABLE);

أيضا قمت بتغير خاصية AutoCommit , ولكن ﻻ فائدة :(

ما زلت أضطر إلى إستخدام هذه الجملة للحصول على أخر تحديث لقواعد البيانات :

"SELECT * FROM STUDENT"

للصداقة البرمجية

pro-vb6@hotmail.com

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