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

كيفية الإتصال بعدد من ال drivers

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

ياإخوان السلام عليكم ورحمة الله إكمالاً لمشواري في محاولة إرسال صورة لقاعدة sqlite

على الرابط :

/index.php?showtopic=227408

فقد أعطاني الأخوة روابط لبعض الـ drivers ونزلتها ولكن لم أعرف كيف أتصل بها بكود جافا

وهي كالتالي :

الأول : sqlite4java ولتنزيله أدخل هذا الرابط : http://code.google.com/p/sqlite4java/

الثاني : sqlite-jdbc-3.6.17.1 ولتنزيله أدخل هذا الرابط : http://www.xerial.org/maven/repository/artifact/org/xerial/sqlite-jdbc/3.6.17.1/

الثالث : 3rdeSQLite ولتنزيله أدخل هذا الرابط : http://rodolfo_3.tripod.com/index.html

علماً أن الإتصال بالـ driver الذي عملت عليه يتم هكذا :

  Class.forName("org.sqlite.JDBC");

ولكن أبحث عن غيره لأنه كما بين الأخوة من الممكن لايدعم إرسال الصور للقاعدة .

فهل هناك قاعدة عامة للإتصال بأي drivers أم لابد من معرفة الطريقة لكل driver ؟

أتمنى من يساعدني , , , ,

تم تعديل هذه المشاركة بواسطة هدف الشمالي في 4 سبتمبر 2010 في 17:15

#2

شيفرتك حتى نستطيع المساعدة

تحياتي

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

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

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

728x90.png

#3
علاء الصالحي كتب:

شيفرتك حتى نستطيع المساعدة

تحياتي

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package newpackage;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import com.almworks.sqlite4java.*;


import photostore.RetrievePhoto;
import photostore.StorePhoto;
/**
 *
 * @author DELL
 */
public class NewClass {
    Connection con;
	File photoFile;
      public static void main(String args[]) {
        try {
            Class.forName("org.xerial.JDBC");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
        }

        }
}

الخطأ في جزء الإتصال

 Class.forName("org.xerial.JDBC");

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

#4

يا أخي هذا يعني أنك لم تقم بإضافة الحزمة إلى IDE الذي تستخدمه

أو أن المسار المكتبو غير موجود في الحزمة

تحياتي

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

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

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

728x90.png

#5

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

على العموم كما ذكر أخي علاء المشكلة قد تكون من المسار الذي كتبته.. حاول ايجاد المسار الصحيح عن طريق قرائه الtutorial والhow-to للمكتبة التي تستخدمها..

بالنسبة لي استخدم SqliteJDBC عند التعامل مع القاعدة.. استخدامها سهل جداً.. فقط ضع ملف الJar لديك في الpath.

http://www.zentus.com/sqlitejdbc/

يوجد أيضاً مثال في نفس الصفحة لتبين كيفية الاستخدام..

بالتوفيق...

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#6
علاء الصالحي كتب:

يا أخي هذا يعني أنك لم تقم بإضافة الحزمة إلى IDE الذي تستخدمه

أو أن المسار المكتبو غير موجود في الحزمة

تحياتي

أنا قمت بإضافة 3 drivers للمشروع وهي موضحة في الأعلى , والآن أوضح الحزم الموجودة في كل driver :

الـ driver الأول هو sqlite4java وفيه الحزم التالية :

META-INF

com.almworks.sqlite4java

javolution.util.stripped

فكيف تكون عملية الإتصال به ؟

الـ driver الثاني هو sqlite-jdbc-3.6.17.1 وفيه الحزم التالية :

META-INF

rde.sqlite3

فكيف تكون عملية الإتصال به ؟

الـ driver الثالث هو 3rdeSQLite وفيه الحزم التالية :

META-INF

META-INF.maven.org.xerial.sqlite-jdbc

native.Linux.amd64

native.Linux.i386

native.Mac.i386

native.Windows.x86

org.ibex.nestedvm

org.ibex.nestedvm.util

org.sqlite

فكيف تكون عملية الإتصال به ؟

#7
Wajdy Essam كتب:

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

على العموم كما ذكر أخي علاء المشكلة قد تكون من المسار الذي كتبته.. حاول ايجاد المسار الصحيح عن طريق قرائه الtutorial والhow-to للمكتبة التي تستخدمها..

بالنسبة لي استخدم SqliteJDBC عند التعامل مع القاعدة.. استخدامها سهل جداً.. فقط ضع ملف الJar لديك في الpath.

http://www.zentus.com/sqlitejdbc/

يوجد أيضاً مثال في نفس الصفحة لتبين كيفية الاستخدام..

بالتوفيق...

أخي 'Wajdy هذا الـ driver الذي كنت أستخدمه وقد أرسلت النصوص عن طريقه وأجريت البحث والتعديل والحذف والحمد لله ولكن إحتجت إرسال صور للقاعدة

ولم أستطع وقال لي الإخوة أن الـ driver ممكن يكون لايدعم إرسال الصور , فهل يمكن إرسال الصور بهذا الـ driver ؟

وقد قمت بتعديل جزء الإتصال وجعلته بهذا الشكل :

 Class.forName("com.almworks.sqlite4java");

وقام بطباعة الإستثناء التالي :

03/09/2010 10:39:02 م newpackage.NewClass main

SEVERE: null

java.lang.ClassNotFoundException: com.almworks.sqlite4java

at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

at java.lang.Class.forName0(Native Method)

at java.lang.Class.forName(Class.java:169)

at newpackage.NewClass.main(NewClass.java:32)

تم تعديل هذه المشاركة بواسطة هدف الشمالي في 4 سبتمبر 2010 في 22:42

#8
اقتباس
ولكن إحتجت إرسال صور للقاعدة ولم أستطع

ما معنى لم تستطيع؟ ارفق الكود ورسائل الخطأ ان وجدت..

القاعدة Sqlite 3 تدعم النوع BLOB .. والدرايفر يعتمد على هذا الاصدار أيضاً..

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

بالتوفيق..

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#9

ابحث في كل حزمة عن الفئة التي ترث الفئة Driver

تحياتي

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

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

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

728x90.png

#10

طيب ياجماعه ايش مشكلة الـDriver الطيب اللي نعرفه sun.JdbcOdbc....إلخ ?

مش هذا يتعامل مع جميع انواع قواعد البيانات ولا ايش الفرق؟


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#11
Wajdy Essam كتب:

ما معنى لم تستطيع؟ ارفق الكود ورسائل الخطأ ان وجدت..

القاعدة Sqlite 3 تدعم النوع BLOB .. والدرايفر يعتمد على هذا الاصدار أيضاً..

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

بالتوفيق..

ياأخ Wajdy ستجد الحزمة اللي فيها البرنامج بالمرفقات وأنا عملت القاعدة ببرنامج SQLite Database Browser 2.0 b1 والقاعدة سميتها pho ووضعت فيها

جدول أسمه ph وفي هذا الجدول هناك عامودين الأول أسمه name ونوعه text والثاني ph ونوعه blob

وعند إضافة صورة للعامود ph يحدث الإستثناء التالي :

Exception in thread "AWT-EventQueue-0" java.lang.AbstractMethodError: org.sqlite.PrepStmt.setBlob(ILjava/io/InputStream;)V

at newpackage.StorePhoto1.store1(StorePhoto1.java:15)

at newpackage.NewJFrame1.btnAddActionPerformed(NewJFrame1.java:217)

at newpackage.NewJFrame1.access$100(NewJFrame1.java:34)

at newpackage.NewJFrame1$2.actionPerformed(NewJFrame1.java:95)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)

at java.awt.Component.processMouseEvent(Component.java:6263)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)

at java.awt.Component.processEvent(Component.java:6028)

at java.awt.Container.processEvent(Container.java:2041)

at java.awt.Component.dispatchEventImpl(Component.java:4630)

at java.awt.Container.dispatchEventImpl(Container.java:2099)

at java.awt.Component.dispatchEvent(Component.java:4460)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)

at java.awt.Container.dispatchEventImpl(Container.java:2085)

at java.awt.Window.dispatchEventImpl(Window.java:2475)

at java.awt.Component.dispatchEvent(Component.java:4460)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

newpackage.7z

تم تعديل هذه المشاركة بواسطة هدف الشمالي في 5 سبتمبر 2010 في 18:09

#12

استبدل الدالتين:

statement.setBlob(2,ph); 
Blob photo = rs.getBlob(1);

ب setByets و getBytes ..

هذا مثال صغير.. الجدول مكون من ثلاث حقول رقم واسم وصورة من نوع blob.

C:\Users\Wajdy Essam\Desktop\sqlite-3_7_2>sqlite3.exe Test.db
SQLite version 3.7.2
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .schema
CREATE TABLE student (number integer, name string, photo blob);
sqlite> .exit
C:\Users\Wajdy Essam\Desktop\sqlite-3_7_2>

سأقوم بحفظ صورة بالاسم a.jpg في القاعدة بعد تحويلها الى byte array .. وعند استرجاعها نقوم بنفس العملية وهي تحويل الbyte array الى صورة..

import java.sql.Connection ;
import java.sql.Statement ;
import java.sql.ResultSet ;
import java.sql.DriverManager ;
import java.sql.PreparedStatement ;
import java.sql.SQLException ;

import java.io.ByteArrayInputStream ;
import java.io.ByteArrayOutputStream ;
import java.io.IOException ;
import java.io.File ;

import javax.imageio.ImageIO ;
import java.awt.image.BufferedImage ;

public class DBImageTest {

	private static final String userName = "" ;
	private static final String password = "" ;

	private static final String DB_PATH  = "jdbc:sqlite:Test.db";
	private static final String DRIVER_PATH = "org.sqlite.JDBC" ;

	private static Connection connection ;
	private static Statement statement ;
	private static ResultSet resultSet ;

	public static void main (String[] args) {
		try {
			Class.forName(DRIVER_PATH);
			connection = DriverManager.getConnection(DB_PATH, userName, password);
		}
		catch (ClassNotFoundException cnfe) {
			System.out.println("Unable to load database driver");
			System.exit(1);
		}
		catch (SQLException se) {
			System.out.println("Cannot connect to database");
			System.exit(1);
		}

		try {
			BufferedImage img = ImageIO.read ( new File("a.jpg") );
			insertStudent(1,"Ahmed",imageToBytes(img));

			printAllStudents();
		}
		catch (IOException se){
			se.printStackTrace();
		}
		catch (SQLException se){
			se.printStackTrace();
		}


		try {
			statement.close();
			connection.close();
		}
		catch (SQLException se){
			System.out.println("Unable to Disconnect");
			System.exit(1);
		}

		System.out.println("End of program");
	}

	public static boolean insertStudent (int number, String name, byte[] images) throws SQLException {
        String insert = "insert into student values(?,?,?)";
		PreparedStatement psInsert = connection.prepareStatement(insert);
		psInsert.setInt(1,number);
		psInsert.setString(2,name);
		psInsert.setBytes(3,images);

        boolean x =  ( psInsert.executeUpdate() > 0 ) ? true : false ;
        psInsert.close();

        return x ;
    }

	public static void printAllStudents () throws SQLException, IOException {
		statement = connection.createStatement();
		String select = "SELECT * FROM student" ;
		resultSet = statement.executeQuery(select);

		while (resultSet.next() ){
			System.out.println("Number: " + resultSet.getString(1));
			System.out.println("Name  : " + resultSet.getString(2));
			System.out.println("Photo : " );

			BufferedImage img = bytesToImage(resultSet.getBytes(3));
			if ( img == null ) {
				System.out.println("Error .... Image == null");
			}
			else {
				ImageIO.write(img, "jpeg", new File("b.jpg"));
				System.out.println("OK...");
			}

			System.out.println();
		}
	}

	private static byte[] imageToBytes (BufferedImage img) throws IOException {
		ByteArrayOutputStream  out = new ByteArrayOutputStream();
		ImageIO.write(img, "jpeg", out);
		return out.toByteArray();
	}

	private static BufferedImage bytesToImage (byte[] data) throws IOException {
		return ImageIO.read( new ByteArrayInputStream(data) );
	}


}

هذه طريقة .. هناك طريقة أخرى وذلك بجعل عمود الصورة من نوع string عادي.. ومن ثم قرائه الصورة وتحويلها لbytes ثم تطبيق Base64 Encoder (عملية تحويل الbinary الى hex string) وهكذا سيتم بكل سهوله حفظ محتوى الصورة داخل حقل من نوع string.. عندما تريد الاسترجاع ستقوم بتطبيق العملية العكسية Base64 Decoder لكي تحول الhex string الى binary data.. هناك كلاسات في JDK لهذا الأمر ولكنها لا ينصح باستخدامها لأنها قد تتغير مع تغير اصدارات الJDK.. اذا أردت تطبيق الBase64 Encoder/Decoder فهناك مكتبة Commons عليك بتحميلها من apache ..

بالتوفيق..

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 5 سبتمبر 2010 في 21:11

2

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#13
Wajdy Essam كتب:

ياأخي لقد قضت إجابتك حاجتي , الله يقضي حوائجك

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

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

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

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

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