这是我的场景我有MS访问数据库(MDB文件),和工作组的安全文件。我有具有所有许可的凭据(管理员用户)。这个DB和MDW文件是在其他计算机上创建的,我现在正在我的计算机上使用它。到目前为止,我所能做的是,我可以用不同的用户名和密码登录数据库,这些用户名和密码存在于数据库中。使用正确的用户名和错误的密码验证。它给出错误,但正确的凭据它登录。现在我需要在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);
返回成功。但是当我尝试用用户名和新密码登录时,它显示错误的密码,甚至旧密码也停止工作。
此外,我尝试使用一些第三方软件读取WorkGroup文件中的所有用户名和密码,它显示MDW文件中的新密码更新正确。
我在Windows XP 32位使用JDK 1.7。有什么问题吗?我做错什么了吗?
如果您想在密码值周围加上引号以适应包含空格的密码,则应该将它们括在双引号中("
)。如果将它们括在单引号中('
),则单引号字符将成为密码的一部分。例如,在执行我的测试代码之后…
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"。