2012-03-29 91 views
3

背景:使用要在Network Solutions託管的Apache服務器上運行的應用程序。朋友/客戶堅持使用Access數據庫而不是SQL數據庫。訪問(.mdb)使用jdbc進行數據庫操作

當前問題:寫了一個Java測試程序,以確保我可以連接到數據庫,然後再着手編寫整個後端。當我運行的Apache服務器的JVM這段代碼的最終產品將被託管:

import java.sql.*; 
import java.io.*; 
public class test { 
    public static void main(String[] args) { 
     try { 
      Class driverClass = Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
      DriverManager.registerDriver((Driver) driverClass.newInstance()); 

      // set this to a MS Access DB you have on your machine 
      String filename = new File(".").getCanonicalPath() + "/ITEMS.mdb"; 


      String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="; 
      database+= filename.trim(); // add on to the end 
      // now we can get the connection from the DriverManager 

      System.out.println(database); 

      Connection conn = DriverManager.getConnection(database); 
     } catch (Exception e) { 
      System.out.println("Error: " + e.getMessage() + " " + e.getLocalizedMessage()); 
      e.printStackTrace(); 
     } 
    } 
} 

我上線連接康恩= DriverManager.getConnection就一個空指針異常(數據庫)

這裏堆棧跟蹤:

java.lang.NullPointerException 

     at sun.jdbc.odbc.JdbcOdbcDriver.initialize(JdbcOdbcDriver.java:436) 

     at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:153) 

     at java.sql.DriverManager.getConnection(DriverManager.java:582) 

     at java.sql.DriverManager.getConnection(DriverManager.java:207) 

     at test.main(test.java:20) 

爲了寫這個測試我用這個作爲我的主要來源:http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=2691&lngWId=2

+0

MS-Access將只能在Windows服務器上運行。 – 2012-03-29 00:50:57

+1

MS-Access也是一個「桌面」數據庫 - 不是多用戶數據庫。如果您將訪問權限暴露給網絡,您將面臨一個受到傷害的世界。做一個大忙,並將所有數據移動到一個真正的多用戶數據庫,如Postgresql或MySql。 – GreyBeardedGeek 2012-03-29 01:46:57

+0

@GreyBeardedGeek雖然我同意你的觀點,但是當別人付賬時,如果他們想要訪問,他們會獲得訪問權限,受到傷害等等。 – corsiKa 2013-09-19 15:52:42

回答

-1

既然你提到了Apache,我會p恢復服務器運行Linux或BSD。
在這種情況下,請看看以下內容:

在Linux上沒有提供針對Access的默認驅動程序,除非您安裝了JDBC,否則JDBC ODBC將不起作用。

除非有非常特殊和壓倒性的好理由使用Access數據庫作爲後臺的網站在Linux服務器上,告訴你的朋友,這不是技術上或經濟上甚相干。

如果您需要在服務器上的輕量級數據庫,使用SQLite:它是免費的,有一個connecting to it from Java in linux很好的支持,有很好的工具(甚至browser plugins),你可以隨時convert that database to Access如果你的朋友想訪問備份偶爾。

否則,像大家一樣去尋找PostgreSQL或MySQL(通常是出於很好的理由)。

+1

我認爲如果你運行的是Apache,那麼你也運行一個Unix操作系統是一個糟糕的決定。有很多運行Windows並仍然運行Apache的商店。 – corsiKa 2013-09-19 15:49:46

0
String strconnect="jdbc:odbc:DRIVER=Microsoft Access Driver (*.mdb, *.accdb);DBQ=" 
Sring filename="some path"; 
StringBuilder a =new StringBuilder(); 
a.append(strconnect); 
a.append(filename); 
String db = a.toString(); 
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
Connection c= DriverManager.getrConnection(db,"","") 
Statement stmt = c.createStament(); 
String query = "some query"; 
stmt.executeQuery(query); 
c.close(); 

千萬別規範的路徑,要麼指定訪問文件的路徑,或使用JFile探索並獲得路徑

也不要忘記關閉連接

+0

顯式的StringBuilder是不必要的。'String db = strconnect + filename;'會爲你自動創建一個字符串生成器。使它更清潔。 :) – corsiKa 2013-09-19 15:51:15

+0

你是對的,但有些情況下包括特殊的字符,所以StringBuilder是保險箱的方式 – Sudharsun 2013-09-20 05:36:42

+1

其實,它們是相同的。當您在Java中的String上使用'+'或'+ ='運算符時,編譯器會將StringBuilder放入結果字節碼中。因此,無論您是否使用+處理器,您都使用StringBuilder。 – corsiKa 2013-09-20 14:01:57

相關問題