JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » JDBC/SQL討論區 » 其他 Database  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
作者 (已解決)JDBC以ODBC連結Access(*.mdb檔)資料讀取空白
hunglong





發文: 13
積分: 0
於 2014-10-12 23:13 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
2014.10.21本題最後解決的方法:安裝舊版的JAVA..我這裡是安裝JDK1.4版....
新的問題要討論的是為什麼安裝新版我無法正確執行!如果有前輩知道再請給答案!
如尚未解則爬文完再開版討論,請各位集思廣義!
ANS:JDK8已經不支援ODBC-JDBC,要繼續使用 ACCESS 資料庫,要使用 X86 版的 JDK7U55 與 JRE .
=========================================================
2014.10.12
因為這個問題卡住整個資料庫的程式都無法再進行,上網目前看到的答案都仍無法修正錯誤,所以要麻煩各位前輩幫忙測試及解答。

關於JDBC連結Access的文章好像不多,大部份都是會用設定絕對路徑的方法設定如下:
"jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=c:\\javatest\\mybook.mdb";

1.仍然無法修正問題!程式執行後跳出訊息:"sun.jdbc.odbc.JdbcOdbcDriver"
然後表格欄位完全讀取不到資料庫mybook.mdb的資料。(下圖一)

2.有設定以下動作:
ODBC資料來源管理員有設定名稱(下圖二)

3.系統為Windows7家用進階版32位元(下圖三)

4.資料庫檔案myBook.mdb,資料表欄位(下圖四)

5.使用編輯器:Eclipse

以下為範例完整程式碼
==========================================================

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;

public class j03160301 extends JFrame
{
Connection ConnObj;
Statement SQLStatement;
ResultSet RS;
//========================
JPanel contentPane;
Panel panel1;
Label L1,L2,L3,L4;
TextField T1,T2,T3,T4;
Button B1,B2,B3,B4;

public j03160301()
{
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(null);
//===========================================
panel1 = new Panel();
panel1.setBounds(0, 0, 290, 130);
panel1.setLayout(null);
panel1.setEnabled(false); //***********
/* 如此游標無法進入其內的 T1~T4,
但看起來不會像 T1.setEnabled(false) 的樣子*/
contentPane.add(panel1); //panel1 是加在 contentPane 內

//用來顯示一筆資料的元件是加在 panel1 內
L1 = new Label("ISBN:");
L1.setBounds(20, 10, 50, 25);
panel1.add(L1);
L2 = new Label("書名:");
L2.setBounds(20, 40, 50, 25);
panel1.add(L2);
L3 = new Label("作者:");
L3.setBounds(20, 70, 50, 25);
panel1.add(L3);
L4 = new Label("價格:");
L4.setBounds(20, 100, 50, 25);
panel1.add(L4);
T1 = new TextField();
T1.setBounds(70, 10, 200, 25);
panel1.add(T1);
T2 = new TextField();
T2.setBounds(70, 40, 200, 25);
panel1.add(T2);
T3 = new TextField();
T3.setBounds(70, 70, 200, 25);
panel1.add(T3);
T4 = new TextField();
T4.setBounds(70, 100, 200, 25);
panel1.add(T4);
//===========================================
B1 = new Button("第一筆");
B1.setBounds(new Rectangle(10, 150, 65, 20));
B1.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
B1_mouseClickedEnvelope; //程式碼較多,寫在另一個方法中
}
});
contentPane.add(B1);

B2 = new Button("上一筆");
B2.setBounds(80, 150, 65, 20);
B2.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
B2_mouseClickedEnvelope; //程式碼較多,寫在另一個方法中
}
});
contentPane.add(B2);

B3 = new Button("下一筆");
B3.setBounds(150, 150, 65, 20);
B3.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
B3_mouseClickedEnvelope; //程式碼較多,寫在另一個方法中
}
});
contentPane.add(B3);

B4 = new Button("最末筆");
B4.setBounds(220, 150, 65, 20);
B4.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
B4_mouseClickedEnvelope; //程式碼較多,寫在另一個方法中
}
});
contentPane.add(B4);
//===================================
this.setBounds(200,100,310,210);
this.setTitle("使用 Select 敘述");
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0); //結束
}
});
this.setVisible(true);
//===========================================
//載入 JDBC Driver、連結資料庫、送 SELECT 敘述、回傳資料集
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//載入JDBC Driver
ConnObj = DriverManager.getConnection("jdbc:odbc:myBook");
//連結 ODBC 設定的 myBook 資料來源,jdbc:subprotocol:Alias
SQLStatement = ConnObj.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY );
/* 其後由此 Statement 物件執行 SQL 指令時,
回傳的會是可捲動且唯讀的 ResultSet 物件。*/
RS = SQLStatement.executeQuery("SELECT * FROM BookData");
//執行 SELECT 敘述,會回傳一個資料集
//查詢 myBook 資料來源之 BookData 資料表全部欄位的記錄

//必須先向下移到第一筆: next(),因為一開始是指到第一筆之前
if( RS.next() )
{ //RS 內至少有一筆記錄,才會回傳 true
//有一筆記錄,才能擷取這筆記錄各欄位的資料
T1.setText( RS.getString("ISBN"));
T2.setText( RS.getString("BookName"));
T3.setText( RS.getString("Author"));
T4.setText( String.valueOf(RS.getInt("Price")));
/* 因 ISBN、BookName、Author 欄位都是 Access 的「文字」
而 Price 欄位是 Access 的「長整數」。 */
}
else
JOptionPane.showMessageDialog(
this,"myBook資料庫內,無任何資料" );
}
catch(Exception ecp)
{ /*為縮短範例程式碼的篇幅,故以 Exception 涵蓋各種例外*/


  JOptionPane.showMessageDialog(this, ecp.getMessage());
}
}//建構子 public j03160301() end

void B1_mouseClicked(MouseEvent e)
{
try
{
RS.first(); //移到第一筆記錄
T1.setText( RS.getString("ISBN"));
T2.setText( RS.getString("BookName"));
T3.setText( RS.getString("Author"));
T4.setText( String.valueOf(RS.getInt("Price")) );
}
catch(SQLException ecp){}
} //B1_mouseClicked(MouseEvent e) end;

void B2_mouseClicked(MouseEvent e)
{
try
{
if( RS.previous() )
{ //移到上一筆記錄
T1.setText( RS.getString("ISBN"));
T2.setText( RS.getString("BookName"));
T3.setText( RS.getString("Author"));
T4.setText( String.valueOf(RS.getInt("Price")) );
}
else
{ //回傳 false 表示移到了第一筆之前
RS.first(); //再移到第一筆
JOptionPane.showMessageDialog(B2, "已到第一筆" );
//不需改變 T1~T4 的文字,因為剛才已顯示第一筆內容
}
}
catch(SQLException ecp){}
} //B2_mouseClicked(MouseEvent e) end

void B3_mouseClicked(MouseEvent e)
{
try
{
if( RS.next() )
{ //移到下一筆記錄
T1.setText( RS.getString("ISBN"));
T2.setText( RS.getString("BookName"));
T3.setText( RS.getString("Author"));
T4.setText( String.valueOf(RS.getInt("Price")) );
}
else
{ //回傳 false 表示移到了最末筆之後
RS.last(); //再移到最末筆
JOptionPane.showMessageDialog(B3, "已到最末筆" );
//不需改變 T1~T4 的文字,因為剛才已顯示最末筆內容
}
}
catch(SQLException ecp){}
} //B3_mouseClicked(MouseEvent e) end


void B4_mouseClicked(MouseEvent e)
{
try
{
RS.last(); //移到最末筆記錄
T1.setText( RS.getString("ISBN"));
T2.setText( RS.getString("BookName"));
T3.setText( RS.getString("Author"));
T4.setText( String.valueOf(RS.getInt("Price")) );
}
catch(SQLException ecp){ }
} //B4_mouseClicked(MouseEvent e) end

public static void main(String[] args)
{
new j03160301();
}
} //public class j03160301 end

j03160301.java (6.71k)


hunglong edited on 2014-10-23 17:19
reply to postreply to post
作者 Re:JDBC以ODBC連結Access(*.mdb檔)資料讀取空白 [Re:hunglong]
pclevin





發文: 322
積分: 0
於 2014-10-14 17:40 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
JDBC連結Access ,目前JDK 只能用32的。
你將你的JVM 換為32位元的。就可以了。


reply to postreply to post
我的網誌
http://pclevin.blogspot.com
作者 Re:JDBC以ODBC連結Access(*.mdb檔)資料讀取空白 [Re:pclevin]
plutotw

井底蛙



發文: 624
積分: 3
於 2014-10-14 21:23 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
http://www.javaworld.com.tw/jute/post/view?bid=21&id=300605&sty=3

reply to postreply to post
任何聰明的傻瓜都可以讓事情更大、更複雜、更激烈。要往反方向發展需要一絲天分以及許多勇氣。-愛因斯坦
作者 Re:JDBC以ODBC連結Access(*.mdb檔)資料讀取空白 [Re:pclevin]
hunglong





發文: 13
積分: 0
於 2014-10-16 17:21 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
感謝幫忙,剛好有新的jdk版本就重下載安裝一次,確認為32位元(如圖),不過還是相同問題!


reply to postreply to post
作者 Re:JDBC以ODBC連結Access(*.mdb檔)資料讀取空白 [Re:hunglong]
pclevin





發文: 322
積分: 0
於 2014-10-16 17:56 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
你的程式沒問題~
我是用1.6 32




reply to postreply to post
我的網誌
http://pclevin.blogspot.com
作者 Re:JDBC以ODBC連結Access(*.mdb檔)資料讀取空白 [Re:pclevin]
hunglong





發文: 13
積分: 0
於 2014-10-16 18:17 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
感謝幫忙測試,可否提供您的資料庫測試檔讓我試看看!
或直接用此版面上傳讓我下載測試!(我的office是2007)
如果仍無法執行,我可能需要檢查是不是其它部份有問題,例如權限之類的
因為我的win7版本經常會說我權限不足,不知道是否也會影響到程式的讀取


hunglong edited on 2014-10-16 20:42
reply to postreply to post
作者 Re:JDBC以ODBC連結Access(*.mdb檔)資料讀取空白 [Re:hunglong]
pclevin





發文: 322
積分: 0
於 2014-10-16 22:04 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
你試試吧!

mydb.rar (22.79k)


reply to postreply to post
我的網誌
http://pclevin.blogspot.com
作者 Re:JDBC以ODBC連結Access(*.mdb檔)資料讀取空白 [Re:pclevin]
hunglong





發文: 13
積分: 0
於 2014-10-18 13:15 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
感謝pclevin提供測試,還是不行,我在新手區看到這一篇,所以我想會不會我那裡路徑設定錯誤
http://www.javaworld.com.tw/jute/post/view?bid=29&id=149784&sty=3&age=0&tpg=1&ppg=1#149784
這篇好像也沒有解...
我附上我的相關設定..再麻煩幫我看看有沒有那裡設定是有錯誤的!感謝
錯誤訊息
[/img]
java安裝路徑

放class的資料夾

odbc設定(使用您提供的檔案)

classpath

path
[img]http://www.javaworld.com.tw/jute/gallery/a/H/aHVuZ2xvbmc=/1413609206219.jpg


hunglong edited on 2014-10-18 13:20
reply to postreply to post
作者 Re:JDBC以ODBC連結Access(*.mdb檔)資料讀取空白 [Re:hunglong]
pclevin





發文: 322
積分: 0
於 2014-10-18 18:01 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
能將你的javatest專案資料夾 壓上來嗎?

reply to postreply to post
我的網誌
http://pclevin.blogspot.com
作者 Re:JDBC以ODBC連結Access(*.mdb檔)資料讀取空白 [Re:pclevin]
hunglong





發文: 13
積分: 0
於 2014-10-18 21:07 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
已經壓縮如附件!更慘的是..我下午想說先用別的資料庫替代一下!我裝了MySQL5.6版...失敗了..
workbench無法安裝.....

我的電腦中還有安裝VS Express和SQL Express..不知道有沒有影響...

javatest.zip (75.31k)


reply to postreply to post
作者 Re:JDBC以ODBC連結Access(*.mdb檔)資料讀取空白 [Re:hunglong]
pclevin





發文: 322
積分: 0
於 2014-10-19 21:59 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
你的程式及專案,我匯到我這裡測是可以的。確定是可以的。

再來就是你的作業系統的問題。
你是否有看plutotw 的這篇
http://www.javaworld.com.tw/jute/post/view?bid=21&id=300605&sty=3
依文中安裝 AccessDatabaseEngine_X64.exe 試試吧


reply to postreply to post
我的網誌
http://pclevin.blogspot.com
作者 Re:JDBC以ODBC連結Access(*.mdb檔)資料讀取空白 [Re:pclevin]
hunglong





發文: 13
積分: 0
於 2014-10-20 01:15 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我請我學弟..也是win7的系統測試..也是沒問題....所以我覺得是我作業系統有問題..
但是另一台筆電也是使用win7但只有安裝vs2008+sql2008
也出現一樣的狀況......
我有看過一篇文章是因為電腦裝太多軟體,後來把電腦重灌清空,結果就正常了

至於plutotw這篇..還沒測試是因為....目前我沒有安裝檔,如果我把office移除掉..暫時不能裝回來
所以我只好放到最後才測試..但是我有試過先裝32位元的檔案..果然是..OK..但不能解決問題
64位元果然不能裝...要如文章所示..先移除才能裝...所以..看來..我只好移除掉..試這個方法看看勒!
我再試試....也感謝pclevin幫忙花這麼多時間協助測試


reply to postreply to post
作者 Re:JDBC以ODBC連結Access(*.mdb檔)資料讀取空白 [Re:hunglong]
hunglong





發文: 13
積分: 0
於 2014-10-21 01:23 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
無法讀取的問題解決了,但是不是最佳解!
先感謝plutotw...原本想說如果這樣再不行,就要移除office安裝--AccessDatabaseEngine_X64.exe
後來可以讀取了...證明系統應該沒問題!
最後還是感謝pclevin一直幫忙,我最後讀取成功的方式是!

我裝了舊版的java....剛好有一個j2SE1.4版...想不到裝完執行成功了....

新的問題是....為什麼我安裝JDK8U25...無法正確讀取資料庫!我可能還是要繼續找答案,因為不可能一直用舊版JAVA。

讓我先爬文一下吧!


reply to postreply to post
作者 Re:JDBC以ODBC連結Access(*.mdb檔)資料讀取空白 [Re:hunglong]
plutotw

井底蛙



發文: 624
積分: 3
於 2014-10-23 12:04 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
java 7 至2015停止支援
java 8 已移除 jdbc-odbc bridge , 所以 要找其他 driver 取代了


reply to postreply to post
任何聰明的傻瓜都可以讓事情更大、更複雜、更激烈。要往反方向發展需要一絲天分以及許多勇氣。-愛因斯坦
作者 Re:JDBC以ODBC連結Access(*.mdb檔)資料讀取空白 [Re:plutotw]
hunglong





發文: 13
積分: 0
於 2014-10-23 17:17 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
感謝plutotw補充...我找到這篇說明...給大家參考一下

http://yhhuang1966.blogspot.tw/2014/04/jdk-8-odbcjdbc.html

看來若要繼續使用 ACCESS 資料庫, 則 X86 版的 JDK7U55 與 JRE 要保存起來比較好.


reply to postreply to post
作者 Re:JDBC以ODBC連結Access(*.mdb檔)資料讀取空白 [Re:hunglong]
plutotw

井底蛙



發文: 624
積分: 3
於 2014-10-23 19:42 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
java 8 要使用 MDB ,可以用thirdparty 的 jdbc driver
目前有看到2個 ,open source 的 UCanAccess . 及 商業 的 StelsMDB


reply to postreply to post
任何聰明的傻瓜都可以讓事情更大、更複雜、更激烈。要往反方向發展需要一絲天分以及許多勇氣。-愛因斯坦
作者 Re:JDBC以ODBC連結Access(*.mdb檔)資料讀取空白 [Re:plutotw]
anderson1203





發文: 1
積分: 0
於 2016-12-09 02:02 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
分享 :Java 8 無法讀Access 2000 ~ 2003 的 mdb檔或是Access2007~ 2013的accdb檔
解決方案,其方式如下:
1.到http://ucanaccess.sourceforge.net/site.html,的網站要download , 最新的Ucanaccess,目前為
UCanAccess-3.0.7-bin.zip,將其解壓縮到D:\
2.將在解壓縮的ucanaccess-XXX.jar, 以及在lib\*.jar , copy 到 C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext 與C:\Program Files\Java\jre1.8.0_111\lib\ext 下,我所用的jdk8 是 jdk 1.8.0_111 的64位元。
3.在java 的程式上實作範例如圖:


ScreenHunter_05 Dec. 09 09.29.jpg (84.61k)


reply to postreply to post
» JWorld@TW »  JDBC/SQL討論區 » 其他 Database

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8