PDA

View Full Version : سوال: خواندن اطلاعات از ديتابيس



ravand
سه شنبه 05 اردیبهشت 1391, 15:56 عصر
سلام.
من از برنامه ي h2-1.3.165 براي ارسال اطلاعاتم به ديتابيس ميخوام استفاده كنم.
جدول و فيلد ها رو به اين شكل ساختم:

CREATE TABLE std_info(ID INT PRIMARY KEY, firstname VARCHAR(255),lostname VARCHAR(255));
INSERT INTO std_info VALUES(1,'mohammad','ravandi');
SELECT * FROM std_info ORDER BY ID;
و كدهاي من اينه كه اطلاعات داخل ديتابيس رو ميخونه
ولي مشكل داره و كار نميكنه:
be.java

import java.sql.*;
public class be{
public static void main(String[] args) throws SQLException {
String dbURL="jdbc:h2:~/test";
String query="select * from std_info";
Statement stmt = null;
ResultSet rs = null;
String userName = "sa";
String userPwd = "";
Connection con;
try { Class.forName("org.h2.Driver");
con = DriverManager.getConnection(dbURL, userName, userPwd);
System.out.println("Connection Successful!");
stmt = con.createStatement();
rs=stmt.executeQuery(query);
}
catch(Exception e) {
e.printStackTrace();
} while(rs.next()){
System.out.println(rs.getString(1));
System.out.println(rs.getString(2));
}
}
}

spiderman200700
سه شنبه 05 اردیبهشت 1391, 19:20 عصر
سلام.
لطفا خطای مربوطه رو اینجا قرار بده تا بتونیم کمکت کنیم.

** و اگه میشه کدهای مربوط به جاوا رو توی تگ java قرار بده. با تشکر **

ravand
سه شنبه 05 اردیبهشت 1391, 19:46 عصر
كل كدهاي من همينه :
import java.sql.*;
public class be{
public static void main(String[] args) throws SQLException {
String dbURL="jdbc:h2:~/test";
String query="select * from std_info";
Statement stmt = null;
ResultSet rs = null;
String userName = "sa";
String userPwd = "";
Connection con;
try { Class.forName("org.h2.Driver");
con = DriverManager.getConnection(dbURL, userName, userPwd);
System.out.println("Connection Successful!");
stmt = con.createStatement();
rs=stmt.executeQuery(query);
}
catch(Exception e) {
e.printStackTrace();
} while(rs.next()){
System.out.println(rs.getString(1));
System.out.println(rs.getString(2));
}
}
}

و اخطاري كه برام مياد اينه:

C:\Documents and Settings\user>f:

F:\>cd jdk

F:\jdk>cd bin

F:\jdk\bin>javac be.java

F:\jdk\bin>java be
java.lang.ClassNotFoundException: org.h2.Driver
at java.net.URLClassLoader$1.run(URLClassLoader.java: 200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.j ava:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:3 06)
at sun.misc.Launcher$AppClassLoader.loadClass(Launche r.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:2 51)
at java.lang.ClassLoader.loadClassInternal(ClassLoade r.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at be.main(be.java:11)
Exception in thread "main" java.lang.NullPointerException
at be.main(be.java:19)

spiderman200700
سه شنبه 05 اردیبهشت 1391, 20:56 عصر
فکر میکنم شما h2-1.3.165 رو به برنامه اضافه نکردی.
اگه از IDE استفاده میکنی از قسمت فایل h2-1.3.165 رو به لایبراری های پروژه اضافه کن. اگر نه ، این فایل رو توی Classpath بذار.
اینطوری حداقل این خطا برطرف میشه.

ravand
سه شنبه 05 اردیبهشت 1391, 21:00 عصر
ببخشيد من از ويرايشگر notepad ++ استفاده ميكنم . حالا اين Classpath كجا هست ؟ چجوري بهش دسترسي داشته باشم؟
متشكرم.

spiderman200700
سه شنبه 05 اردیبهشت 1391, 22:02 عصر
فایل h2-1.3.165 رو کنار کلاس های برنامه بذار.(یعنی کنار فایلهای با پسوند class)

ravand
چهارشنبه 06 اردیبهشت 1391, 10:14 صبح
من الان اين فايل be.java رو داخل پوشه ي bin قرار دادم . يعني اين ادرس :

F:\jdk\bin
در همين پوشه يه فايل هم با نام be.class براي همين فايل ساخته شده من قبلا فايل h2-1.3.165 رو داخل اين پوشه و كنار اين فايل class قرار داده بودم ولي مشكل حل نشد.
نميدنم شايد منظورتون يه فايل كلاس ديگه هست. اگه ميشه يه كم كامل تر توضيح بديد.
متشكرم

spiderman200700
چهارشنبه 06 اردیبهشت 1391, 14:24 عصر
من تا حالا هر وقت یه پروژه نوشتم که لازم بوده از کتابخونه استفاده کنم، توی یه IDE استفاده کرم.
ولی تنها چیزی که در مورد استفاده از یه کتابخونه ، موقع اجرای دستی برنامه میدونم اینه که، باید کتابخونه رو موقع اجرا ،کنار فایلهایت قرار بدی.
در مشکل کد شما اینه که کتابخونه ی H2 رو نمیشناسه.
اگه احیانا داری از NetBeans استفاده میکنی، من میتونم کاملا راهنماییت کنم.

ravand
چهارشنبه 06 اردیبهشت 1391, 14:58 عصر
حالا اگه ميتوني توي برنامه ي NetBeans برام توضيح بده.
البته من قبلش اين برنامه رو نصب كرده بودم ولي حجمش زياد بود و چون توي سيستمم چند تا برنامه نصب كرده بودم گفتم پاكش كنم.
متشكرم

spiderman200700
چهارشنبه 06 اردیبهشت 1391, 19:37 عصر
توی NetBeans از قسمتی که توی عکس نشون دادم، روی Add Jar/Folder کلیک کن و فایل H2 رو انتخاب کن.
به همین راحتی.

ravand
پنج شنبه 07 اردیبهشت 1391, 10:43 صبح
خيلي ممنون داداش
مشكلم با اين برنامه حل شد . فكر ميكنم بدون اين برنامه نميشه اين كار رو كرد چون وقتي توي command prompt دستور رو وارد ميكنم دنبال پوشه ي classes كه برنامه ي NetBeans معمولا ايجاد ميكنه ميگرده.
حالا من نميدونم توي اين برنامه ي NetBeans چجوري فايل jar ايجاد كنم؟
توي command prompt با دستور زير اين كار رو كردم :

jar cfm be.jar main.TXT be.class
متشكرم.

ravand
پنج شنبه 07 اردیبهشت 1391, 11:06 صبح
حل شد دكمه ي چكش رو زدم يه فايل توي اين ادرس ساخته شده.

F:\jdk\bin\be\dist

ravand
پنج شنبه 07 اردیبهشت 1391, 17:05 عصر
من گشتم يه كد پيدا كردم كه ساده است و براي چاپ فيلد هاي داخل ديتابيس هست.
package be;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Main {
public static void main(String[] args) {
try {
Class.forName("org.h2.Driver");
Connection connection = DriverManager
.getConnection("jdbc:h2:~/test","sa", "");

System.out.println("DATABASE NAME IS:"+ connection.getMetaData().getDatabaseProductName()) ;
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM std_info");
while (resultSet.next()) {
System.out.println("EMPLOYEE NAME:"+ resultSet.getString("FIRSTNAME"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
من نياز دارم يه نفر بياد برام قسمت هاي مختلفش رو توضيح بده.
من به صورت كلي ميتونم اين كد رو توضيح بدم .
الان با دستوراتي به ديتابيس وصل شديم ، بعد تمام فيلد هاي جدول std_info رو با دستور select و ستاره انتخاب كرديم . بعد امديم يه حلقه ي while ايجاد كرديم كه متوني كه داخل فيلد مورد نظر هست رو پشت سر هم چاپ ميكنه:
getString("FIRSTNAME"
حالا من يه سري دستورات رو نميتونم بفهمم براي چي هست.
مثلا:
1)DriverManager
2) getMetaData
3)connection.createStatement();
4)catch (Exception e)
5)e.printStackTrace
يكي اين catch هست و ديگري try كه من زياد توي كدها ديدم ولي نميدونم چه كار بردي دارن.
بازم از لطفتون متشكرم.

spiderman200700
پنج شنبه 07 اردیبهشت 1391, 17:39 عصر
try و catch دو کلمه ی کلیدی برای مدیریت استثنا(exeption) یا به قول شما خطا های زمان اجرای برنامه هست.
یعنی جاهایی که احتمال داره استثنا توش به وجود بیاد توی بلاک try و catch میذاریم. به این صورت که کدهای اصلی رو داخل بلاک try مینویسیم , و کدهایی رو که میخوایم در صورت بروز استثنا اجرا بشه توی بلاک catch مینویسیم.
اینجا یه نکته وجود داره و اون اینه که مثلا اگه یه برنامه ی 10 خطی داشته باشیم و در خط 5 یه استثنا پیش بیاد، اجرای برنامه در خط 5 قطع میشه و به بلاک catch منتقل میشه. یعنی کدهای خط 5 تا 10 دیگه اجرا نمیشن.

برای توضیحات بیشتر به مقاله ای که توی این تایپک وجود داره مراجعه کن:
http://barnamenevis.org/showthread.php?159114-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4-%D8%A7%D8%B3%D8%AA%D8%AB%D9%86%D8%A7-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7