2013-05-22 29 views
0

這是我的方案 我有MS Access DB(MDB文件)和工作組安全文件。我擁有擁有所有許可證的證書(管理員用戶)。這個數據庫和MDW文件是在其他一些計算機上創建的,現在我在我的電腦上使用它。 我到現在爲止所能做的是,我可以使用DB中存在的不同用戶名和密碼登錄數據庫。通過使用正確的用戶名和錯誤的密碼進行驗證它給出了錯誤,但它登錄的憑據正確。 現在我需要在Java中創建一個接口來實現基本功能。 1.更改當前登錄用戶的密碼。當前用戶問題設置密碼爲現有的JDBC MS Access工作組(MDW)Java

更改密碼是我的代碼更改密碼

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
String database = "jdbc:odbc:"+"mdbTEST"; 
// mdbTEST is created in System DNS which uses SECURED.MDW file and 
// ExtendedAnsiSQL is set to 1 
conn = DriverManager.getConnection(database, "administrator", "hello"); 

String q = "ALTER USER "+uname+" PASSWORD "+newPass+" '"+oldPass+"'"; 
stmt = conn.createStatement(); 
stmt.execute(q); 

它成功返回。 但是,當我嘗試使用用戶名和新密碼登錄時,它說錯誤密碼,甚至舊密碼停止工作。

此外,我嘗試使用某些第三方軟件讀取WorkGroup文件中的所有用戶名和密碼,它顯示MDW文件中正確更新了新密碼。

我在Windows XP 32位上使用JDK 1.7。 有什麼問題?我在這裏做錯了什麼? 在此先感謝。

回答

0

如果要將密碼值的引號括起來以容納包含空格的密碼,則應將其用雙引號括起來(")。如果將它們用單引號括起來('),則單引號字符將成爲密碼的一部分。例如,執行我的測試代碼...

import java.sql.*; 

public class ulsTest { 
    public static void main(String args[]) 
    { 
     try 
     { 
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
      Connection conn = DriverManager.getConnection(
        "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};" + 
        "DBQ=C:\\Users\\Public\\uls\\ulsTest.mdb;" + 
        "SystemDB=C:\\Users\\Public\\uls\\Security.mdw;" + 
        "Uid=Gord;" + 
        "Pwd=obfuscated;" + 
        "ExtendedAnsiSQL=1;"); 

      String UID = "Tim"; 
      String oldPWD = "oldpassword"; 
      String newPWD = "I like Java"; 

      Statement s = conn.createStatement(); 
      s.execute("ALTER USER " + UID + " PASSWORD \"" + newPWD + "\" \"" + oldPWD + "\""); 
      // ALTER USER Tim PASSWORD "I like Java" "oldpassword" 

      System.out.println("User updated."); 

      s.close(); 
      conn.close(); 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

後... Tim是能夠登錄使用新密碼

I like Java 

但是,如果我改變我的代碼...

s.execute("ALTER USER " + UID + " PASSWORD '" + newPWD + "' '" + oldPWD + "'"); 
// ALTER USER Tim PASSWORD 'I like Java' 'oldpassword' 

...然後單引號成爲新的密碼和Tim必須鍵入密碼的一部分......

'I like Java' 

...(包括單引號)登錄

旁註:我希望一個參數化查詢可能避免與字符串搞亂報價,但遺憾的是代碼...

PreparedStatement s = conn.prepareStatement("ALTER USER ? PASSWORD ? ?"); 
s.setString(1, UID); 
s.setString(2, newPWD); 
s.setString(3, oldPWD); 
s.execute(); 

...失敗,出現錯誤:

[Microsoft][ODBC Microsoft Access Driver] Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

+0

我可以跟你聊天? –