这是我的场景 我有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。 可能是什么问题?我在这里做错了吗? 在此先感谢。
答案 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'。