PDA

View Full Version : سوال: ارور هنگام اتصال به SQL Server



forodo
جمعه 30 آبان 1393, 21:30 عصر
سلام
من با کدهای زیر می خوام یه مقداری رو از بانک بگیرم و نشون بدم ولی ارور میده.
NetBeans IDE 8.0.1
SQL Server 2014
تا اونجایی که فهمیدم از NetBeans 6 به بعد نیازی نیست که فایل jarای به برنامه اضافه کنیم.
اون Class.forNmae نمی دونم چیه.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JOptionPane;
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn = DriverManager.getConnection("jdbc:sqlserver:.;user=sa;password=***;database=Jav aTest");
System.out.println("test");
Statement sta = conn.createStatement();
String Sql = "select * from tblJavaTest";
ResultSet rs = sta.executeQuery(Sql);
while (rs.next()) {
JOptionPane.showMessageDialog(null, rs.getString("Name"));
}
} catch (Exception e) {
e.printStackTrace();
}
اروره زیر رو می ده:
java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
at java.net.URLClassLoader$1.run(URLClassLoader.java: 372)
at java.net.URLClassLoader$1.run(URLClassLoader.java: 361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.j ava:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:4 24)
at sun.misc.Launcher$AppClassLoader.loadClass(Launche r.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:3 57)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:259)
at NewJFrame.jButton1ActionPerformed(NewJFrame.java:7 0)
at NewJFrame.access$000(NewJFrame.java:18)
at NewJFrame$1.actionPerformed(NewJFrame.java:43)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2346)
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:6527)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3321)
at java.awt.Component.processEvent(Component.java:629 2)
at java.awt.Container.processEvent(Container.java:223 4)
at java.awt.Component.dispatchEventImpl(Component.jav a:4883)
at java.awt.Container.dispatchEventImpl(Container.jav a:2292)
at java.awt.Component.dispatchEvent(Component.java:47 05)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:4462)
at java.awt.Container.dispatchEventImpl(Container.jav a:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2739 )
at java.awt.Component.dispatchEvent(Component.java:47 05)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.j ava:746)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPri vilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPri vilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:719)
at java.awt.EventQueue$4.run(EventQueue.java:717)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPri vilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 716)
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)

vahid-p
جمعه 30 آبان 1393, 22:22 عصر
چی چیو نمیخواد.
اررور ClassNotFoundException میگه کلاس رو پیدا نمیکنه. شما باید Library درایور دیتابیس SQLSERVER رو دانلود کنی و به بخش Library هات اضافه کنی، اونوقت اجرا میشه.
لینک دانلود : http://www.microsoft.com/en-us/download/details.aspx?id=11774

Class.forName کاری شبیه به همون import کردن اما به صورت دینامیک انجام میده. مثلا میتونی در هنگام اجرای یک برنامه حتی یه کلاس رو فقط با نوشتن اسمش صدا بزنی. یعنی شما میتونستید import کنید، اما همواره پیشنهاد شده از این عبارت استفاده بشه. یه دلایلی داشت که یادم نمیاد چی بود :لبخند:

forodo
جمعه 30 آبان 1393, 22:46 عصر
من تازه کارم.
از zip که درآوردم و اون exeهارو اجرا کردم اون 4تا پوشه رو بهم داد.
چه فایلهایی رو باید بردارم و کجا باید قرار بدم؟
http://8pic.ir/images/t4f3n088non3ihf6jn0w.png

vahid-p
شنبه 01 آذر 1393, 00:46 صبح
دنبال فایلی شبیه به این باش : sqljdbc4.jar
پسوندش jar هست. تو پوشه sqljdbc_4.1 رو چک کن.

بعد تو نت بینز اونجا که پوشه ها و کلاس هات سمت چپ معمولا نوشته، رو Library راست کلیک کن و Add Jar/Folder رو کلیک کن. بعد از اونجا اون فایل jar که گفتم رو انتخاب کن. بعد دوباره برنامه رو اجرا کن جواب میده

http://8pic.ir/images/nuzwqls8trt0flrvx48n.jpg

البته میتونی مسیرشو هم به برنامه بدی و کتابخونه رو معرفی کنی، ولی اینی که گفتم راحتتره.

forodo
شنبه 01 آذر 1393, 09:47 صبح
دست گلت درد نکنه.
درست شد ولی یه اروره دیگه میگه که انگار دیتابیس رو نمیشناسه.
من این کد رو از StackOverFlow کپی کردم. ConnectionString درسته؟
http://8pic.ir/images/oi1gv2ellm5qf75h3wpr.png

محمد فدوی
شنبه 01 آذر 1393, 11:12 صبح
من تابحال ندیدم توی ConnectionString از نقطه استفاده بشه (برای اشاره به localhost) و کلیدواژه ی database رو هم در مورد درایور SQL Server ندیدم. اینو تست کن ببین درست نمیشه:


Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=DATABASE_NAME;user=USE RNAME;password=PASSWORD");

forodo
شنبه 01 آذر 1393, 19:38 عصر
درست شد.
فقط یه سوال:
چه طوری می شه گفت فلان سلول رو نشون بده؟
توی #C می گفتیم:
string s = dt.Rows[0]["Name"].ToString();
الان با کد زیر 3تا رو دونه دونه نشون میده.
while (rs.next()) {
JOptionPane.showMessageDialog(null, rs.getString("Name"));
}

محمد فدوی
شنبه 01 آذر 1393, 19:55 عصر
بهتره توی یه تاپیک چند سوال رو مطرح نکنید.
توی #C یه تفاوت مهم وجود داشت با Java. شما اونجا از یه DataSet/DataTable برای خوندن داده ها استفاده میکنی. به اینصورت که اول کل داده ها رو توی یه DataSet/DataTable میریزی و بعد میتونی مثل یه ساختمان داده ی ساده اطلاعات رو ازش بخونی...
اما هیچوقت ارتباط با یه دیتابیس به این صورت نیست که همه ی اطلاعات یه دفعه وارد شن! اطلاعات بصورت ردیف به ردیف توی بستر TCP/IP منتقل میشن و واسه همین هم در سمت برنامه نویسی اطلاعات بصورت ردیف به ردیف دریافت میشن. در مورد استفاده از DataSet/DataTable در #C این اطلاعات بصورت خود به خود توسط یه شیء DataReader خط به خط خونده میشن و در شیء DataSet/DataTable قرار میگیرن و بعد شما میتونی خیلی راحت باش برخورد کنی.

توی Java معادل DataReaderها همین ResultSetها هستن که اطلاعات رو بصورت ردیف به ردیف میخونن. راه حل های مشابه #C توی Java هم وجود دارن و تازه خیلی متنوع تر. مثلا میتونی از انواع مختلفی از ORM (http://en.wikipedia.org/wiki/Object-relational_mapping)ها استفاده کنی. یا اگه میدونی حجم اطلاعاتت زیاد نیست میتونی خیلی ساده اونا رو توی یه ساختمان ذخیرشون کنی و بعد بخونیشون. البته فقط اینکار رو در صورتی انجام بده که مطمین باشی حجم داده ها کمه.

ویرایش:
شما اگه صرفا به یه سلول نیاز داری, بهتره به جای اینکه همه ی داده ها رو Query کنی, Query رو جوری تغییر بدی که فقط اون داده رو برگردونه (مثلا داده ای که IDش برابر 3 باشه):

SELECT * FROM my_table WHERE id = 3

اما اگه اصرار داری در همین وضعیت بتوی یه سلول دلخواه رو داشته باشی یا به روشی که در بالاتر گفتم داده ها رو اول Map کن یا اگه کارت خیلی سنگین نیست اینجوری عمل کن:


int count = 0;
String name = "";
while(rs.next()) {
if(count == 2) {
name = rs.getString("Name");
break;
}
count++;
}
...