ورود

View Full Version : مشکل JDBC با زبان فارسی



hossein71
پنج شنبه 09 شهریور 1391, 07:57 صبح
چطور میتونم با درایور JDBC از دیتایبس داده های فارسی بگیرم؟(وقتی داده ها رو میگیرم علامت سوال نشون میده)
دیتابیس من Access هست. در زیرهم کدهای اتصال به دیتابیسم رو نوشتم.

Properties p=new Properties();
p.put("charSet", "UTF8");
dbURL="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+mydb;
connection=DriverManager.getConnection(dbURL,p);
st=connection.createStatement();
str="select * from plan where work='"+Find+"'";
System.out.print(Find);
rs=st.executeQuery(str);

parnian~parnian
پنج شنبه 09 شهریور 1391, 12:42 عصر
مشکل از data base نیست . چون که شما از System.out.print استفاده کردین و این دستور خروجی رو توی consol مینویسه ، و مسئله اینه که consol خروجی فارسی رو به شکل علامت سوال مینویسه .

hossein71
پنج شنبه 09 شهریور 1391, 14:40 عصر
اتفاقا اصلا با System.out.print مشکلی ندارم و فارسی چاپ میکنه اون رو به دلیل دیگه ای گذاشتم.من داده هام رو از طریق JLabel چاپ میکنم.در JLabel علامت سوال نشون میده.(rs داده های فارسی رو بصورت علامت سوال برمیگردونه)

javaphantom
پنج شنبه 09 شهریور 1391, 17:47 عصر
چطور میتونم با درایور JDBC از دیتایبس داده های فارسی بگیرم؟(وقتی داده ها رو میگیرم علامت سوال نشون میده)
دیتابیس من Access هست. در زیرهم کدهای اتصال به دیتابیسم رو نوشتم.

Properties p=new Properties();
p.put("charSet", "UTF8");
dbURL="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+mydb;
connection=DriverManager.getConnection(dbURL,p);
st=connection.createStatement();
str="select * from plan where work='"+Find+"'";
System.out.print(Find);
rs=st.executeQuery(str);



dbURL="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+mydb+"?useEncoding=true&characterEncoding=UTF-8";

hossein71
پنج شنبه 09 شهریور 1391, 17:59 عصر
جناب javaphantomممنون ولی وقتی کد شمارو به صورت زیر جایگزین کردم نمیتونه به دیتابیس وصل بشه و قسمت catch اجرا میشه.

try{

dbURL="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+mydb+"?useEncoding=true&characterEncoding=UTF-8";
connection=DriverManager.getConnection(dbURL);
st=connection.createStatement();
str="select * from plan where work='"+Find+"'";
rs=st.executeQuery(str);
while(rs.next())
Count++;
rs=st.executeQuery(str);
String array[][]=new String[Count][3];
int i=0;
while(rs.next()){
for(int j=0;j<3;j++)
array[i][j]=rs.getString(j+2);
i++;
}
return array;
}

catch(SQLException sqlEx) {
System.out.println("Cannot connect to database!");
return null;
}

javaphantom
جمعه 10 شهریور 1391, 15:29 عصر
تو كد بين character فاصله افتاده اون فاصله نبايد باشه

hossein71
جمعه 10 شهریور 1391, 15:52 عصر
نه به خاطر اون نیست اون فاصله رو هم درست کردم فایده نداشت.

MehdiRah
شنبه 11 شهریور 1391, 09:30 صبح
من جای شما بودم یک تستی در reginal option می زدم یعنی location = iran - advaned = farsi - genral english

hossein71
شنبه 11 شهریور 1391, 09:46 صبح
منظورتون کنترل پنل ویندوزه؟یه خورده دقیقتر آدرس بدید ممنون میشم

javaphantom
شنبه 11 شهریور 1391, 10:25 صبح
چطور میتونم با درایور JDBC از دیتایبس داده های فارسی بگیرم؟(وقتی داده ها رو میگیرم علامت سوال نشون میده)
دیتابیس من Access هست. در زیرهم کدهای اتصال به دیتابیسم رو نوشتم.

Properties p=new Properties();
p.put("charSet", "UTF8");
dbURL="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+mydb;
connection=DriverManager.getConnection(dbURL,p);
st=connection.createStatement();
str="select * from plan where work='"+Find+"'";
System.out.print(Find);
rs=st.executeQuery(str);


حالا اینجوری امتحان کن



Properties props = new Properties();
props.put ("charSet", "UTF-8");
dbURL="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+mydb+","+props;

javaphantom
شنبه 11 شهریور 1391, 10:26 صبح
من جای شما بودم یک تستی در reginal option می زدم یعنی location = iran - advaned = farsi - genral english

از این روش فکر نکم جواب بگیری . به آخرین پست من برگرد و کاری که گفتم رو اتجام بده

hossein71
شنبه 11 شهریور 1391, 10:34 صبح
کاری رو که گفتید انجام دادم درست نشد.قسمت catch اجرا میشه.
مشکل از خود Access نیست؟

javaphantom
شنبه 11 شهریور 1391, 11:59 صبح
کاری رو که گفتید انجام دادم درست نشد.قسمت catch اجرا میشه.
مشکل از خود Access نیست؟


این چی می گه


Properties properties=new Properties();
properties.setProperty("charSet","UTF-8");
Connection con = DriverManager.getConnection(url,properties);

hossein71
شنبه 11 شهریور 1391, 14:09 عصر
این حالتی که گفتید از اول همینجوری گذاشته بودم.در این حالت به دیتابیس وصل میشه ولی همونطور که در پست اول گفتم داده های فارسی از دیتابیس استخراج شده رو بصورت علامت سوال نشون میده.

Properties properties= new Properties();
properties.setProperty("charSet", "UTF-8");
dbURL="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+mydb;
connection=DriverManager.getConnection(dbURL,prope rties);

راستی در برنامه من بین properties فاصله نیفتاده این مشکل سایته که اینجوری شده.

hossein71
یک شنبه 12 شهریور 1391, 08:42 صبح
یعنی واقعا نمیشه در JDBC از زبان فارسی استفاده کرد?

javaphantom
یک شنبه 12 شهریور 1391, 09:06 صبح
یعنی واقعا نمیشه در JDBC از زبان فارسی استفاده کرد?

شما اون access فایل رو انجا بزارید که فارسی داخلش هست تا بشه کاری کرد.

hossein71
یک شنبه 12 شهریور 1391, 09:14 صبح
فایل Access ضمیمه شده

hossein71
یک شنبه 12 شهریور 1391, 09:55 صبح
دوستان برنامه MS Access JDBC Driver ارتباط مشکل من داره؟

javaphantom
یک شنبه 12 شهریور 1391, 10:52 صبح
حالا برو بگو جاوا بده


public class MyTest {

public static final String MY_FILE = "c:/Hamed.mdb";
public static final String MY_URL = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=";
public static final String SELECT_ALL = "select * from plan";

private List<MyModel> modelList;

public MyTest() {
try {
this.modelList = new ArrayList<MyModel>();
Properties properties= new Properties();
properties.put("charSet", "windows-1256");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection connection = DriverManager.getConnection(MY_URL + MY_FILE.trim(),properties);
PreparedStatement preparedStatement = connection.prepareStatement(SELECT_ALL);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
MyModel myModel = new MyModel();
myModel.setId(resultSet.getString("id"));
myModel.setDescription(resultSet.getString("description"));
myModel.setTime(resultSet.getString("time"));
myModel.setWork(resultSet.getString("work"));
modelList.add(myModel);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}

/**
*
* @return
*/
public List<MyModel> getModelList() {
return modelList;
}


public static void main(String[] s) {
MyTest myTest = new MyTest();
for (MyModel myModel:myTest.getModelList()) {
System.out.println("myModel.getId() = " + myModel.getId());
System.out.println("myModel.getTime() = " + myModel.getTime());
System.out.println("myModel.getWork() = " + myModel.getWork());
System.out.println("myModel.getDescription() = " + myModel.getDescription());
System.out.println("**********************************************");
}
}

}

class MyModel {
private String id;
private String work;
private String time;
private String description;

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getTime() {
return time;
}

public void setTime(String time) {
this.time = time;
}

public String getWork() {
return work;
}

public void setWork(String work) {
this.work = work;
}
}

hossein71
یک شنبه 12 شهریور 1391, 13:08 عصر
تا وقتی شما هستی عمرا بگیم جاوا بده
بر اساس کدهایی که نوشتید برنامم رو بازنویسی کردم. کل کدهای کلاس دیتابیس برنامه من بصورت زیره. یه سوال، شما در برنامه بالا Properties رو import کردین؟

در این حالت به دیتابیس وصل میشه ولی بازهم علامت سوال نشون میده.

import java.sql.*;
import java.util.Properties;
public class DataBase {
public static final String dbURL="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=";
public static final String mydb="C:/Hamed.mdb";
int Count=0;
public String[][] Records(String Find)
{
try{
Properties properties= new Properties();
properties.put("charSet", "windows-1256");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection connection=DriverManager.getConnection(dbURL+mydb. trim(),properties);
String str="select * from plan where work='"+Find+"'";
PreparedStatement ps=connection.prepareStatement(str);
ResultSet rs=ps.executeQuery();
while(rs.next())
Count++;
rs=ps.executeQuery();
String array[][]=new String[Count][3];
int i=0;
while(rs.next()){
for(int j=0;j<3;j++)
array[i][j]=rs.getString(j+2);
i++;
}
return array;
}
catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
}

javaphantom
یک شنبه 12 شهریور 1391, 14:36 عصر
شما مشکل اصلی تون همان encoding بود که اگر با windows-1256 که اونجا من اعمال کردم استفاده کنید باید مشکل کارتون حل بشه. چود دقیقا سمت من این اتقاف افتاد و اطلاعات رو راحت به فارسی دیدم

hossein71
یک شنبه 12 شهریور 1391, 16:23 عصر
سلام
دوست عزیز خیلی ممنون زحمت دادم بهت.برنامه ای رو که برام فرستادی اجراش کردم بازهم رکوردهای فارسی رو علامت سوال نشون میده.در عکس زیر قسمتی که دورش خط کشیدم مشخص هست.به هر حال ممنون

یعنی واقعا کسی دیگه ای در این فوروم نمیدونه من باید چیکار کنم خیلی بهش نیاز دارم.

92234

javaphantom
یک شنبه 12 شهریور 1391, 18:45 عصر
یعنی واقعا کسی دیگه ای در این فوروم نمیدونه من باید چیکار کنم خیلی بهش نیاز دارم.

حالا که چیزی نشده. دارم کمکت می کنم دیگه که حل بشه

می روی این سایت http://www.websina.com/bugzero/kb/java-encoding-charset.html

می گردی توی این عربی ها کدوم استاندارد بهت جواب می ده. مثلا این جواب نداد windows-1256

شاید یک عربی دیگه مثل ISO8859_6 کارت رو راه انداخت. این رفتارا چیه از خودت نشون می دی.

مشکلت چیزه مهمی نیست برای همه پیش اومده

hossein71
یک شنبه 12 شهریور 1391, 20:19 عصر
هم Arabicها رو گذاشتم هم چندتای دیگه رو فایده نداشت.(هنوز علامت سوال برمیگردونه)
در بالای این جدولها(سایتی که بهم معرفی کردی)گفته از charsets.jar استفاده میکنه.نباید اینهارو در پروژه import کنم؟
همینطور java.nio،java.io و java.lang

javaphantom
یک شنبه 12 شهریور 1391, 20:40 عصر
هم Arabicها رو گذاشتم هم چندتای دیگه رو فایده نداشت.(هنوز علامت سوال برمیگردونه)
در بالای این جدولها(سایتی که بهم معرفی کردی)گفته از charsets.jar استفاده میکنه.نباید اینهارو در پروژه import کنم؟
همینطور java.nio،java.io و java.lang

اون که نه درست هست چون توی rt.jar هست پس حله.

به جای charSet از این استفاده کن characterEncoding
توی قسمت properties ها ببین چی می شه

hossein71
یک شنبه 12 شهریور 1391, 22:10 عصر
فایده نداشت

javaphantom
یک شنبه 12 شهریور 1391, 22:36 عصر
فایده نداشت

کدت رو بزار تو سایت

javaphantom
دوشنبه 13 شهریور 1391, 12:10 عصر
کدهای کل پروژه ام رو ضمیمه کردم.
فقط آدرس دیتابیس رو حواست باشه که درست باشه

با jdk 1.6 کامپایل کن و برو همون برنامه ا ی که بهت دادم که کامل بود با charSet ی که windows-1256 بود. من برنامت رو ران کردم و هیچ مشکلی نداشت با charSet windows-1256 شاید مشکل jdk باشه که باز من بعیید می دونم ولی امتحان کن

javaphantom
دوشنبه 13 شهریور 1391, 12:12 عصر
راستی اینم یک خروجی از برنامت


f2012-05-04 00:00:00fghfdhhhsdhn2012-07-03 00:00:00hgjfghjfgjfgjb2012-06-02 00:00:00سلام حسينn2012-07-03 00:00:00sgjfggfgjfgjn2012-07-03 00:00:00fhn2012-07-03 00:00:00rhsrdhn2012-07-03 00:00:00hgn2012-07-03 00:00:00igghjfghjfhdfgjfgjسnullسلام عل

hossein71
سه شنبه 14 شهریور 1391, 11:53 صبح
با Jdk 6 برنامه شما رو اجرا کردم فایده نداشت.یه دور Jdk رو پاک کردم رفتم از یه سایت دیگه دانلود کردم دوباره نصب کردم فایده نداشت.یه دور netbeans رو پاک کردم رفتم از یه سایت دیگه دانلود کردم فایده نداشت.

hossein71
چهارشنبه 15 شهریور 1391, 21:38 عصر
دوست عزیز جناب javaphantom (http://barnamenevis.org/member.php?17370-javaphantom) مشکل بالاخره حل شد.
دو کار باید انجام بشه یکی اینکه همونطور که شما گفتید charset باید روی windows-1256 باشه یکی دیگه هم که نمیدونستم تنظیمات control Panel ویندوز هست.
در عکس های زیر مرحله به مرحله مشخصه باید چیکار بکنیم.

92425

92426

92428

92427


92429http://barnamenevis.org/images/misc/pencil.png

javaphantom
پنج شنبه 16 شهریور 1391, 10:18 صبح
خوب خدارو شکر که کارتون راه افتاد. من کاری نکردم. خودت بودی که فهمیدی مشکل چیه. موفق باشی