为JDBC MS Access Workgroup(MDW)Java中的现有设置密码时出现问题

时间:2013-05-22 05:50:28

标签: ms-access jdbc

这是我的场景 我有MS Access DB(MDB文件)和工作组安全文件。我有拥有所有许可证的凭据(管理员用户)。此DB和MDW文件是在其他计算机上创建的,我现在正在计算机上使用它。 到目前为止我能做的是,我可以使用DB中存在的不同用户名和密码登录数据库。通过使用正确的用户名和错误的密码验证这一点它给出了错误,但它登录的凭据正确。 现在我需要在Java中创建一个基本功能接口。 1.更改当前登录用户的密码。

更改当前用户的密码

以下是我更改密码的代码

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); 

它返回成功。 但是当我尝试使用用户名和新密码登录时,它会显示错误的passowrd,甚至旧密码也会停止工作。

此外,我尝试使用某些第三方软件读取WorkGroup文件中的所有用户名和密码,它显示新密码在MDW文件中正确更新。

我在Windows XP 32位上使用JDK 1.7。 可能是什么问题?我在这里做错了吗? 在此先感谢。

1 个答案:

答案 0 :(得分: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]无效的SQL语句;预期'DELETE','INSERT','PROCEDURE','SELECT'或'UPDATE'。