C++Builder6.0代码修改access数据库密码
用了adoquery来执行sql,网上的资料基本都是又长又蛋疼的delphi代码,而且都是利用了ADO的压缩MDB数据库实现。我需要用sql直接实现。这样用户可能很方便的修改access数据库密码。
修改数据库密码的sql大家都知道的 alter database password newpwd oldpwd
但是仍有2个细节需要注意
1,access需要以独占方式打开或者链接。
代码
dm_Main->ado_Conn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;\
Data Source='"+ strPath +"';Mode=Share Deny Read|Share Deny Write;Persist Security Info=false;\
Jet OLEDB:Database Password='"+ strDBPWD +"';";//这里的关键在于Mode参数的赋值为独占方式
Data Source='"+ strPath +"';Mode=Share Deny Read|Share Deny Write;Persist Security Info=false;\
Jet OLEDB:Database Password='"+ strDBPWD +"';";//这里的关键在于Mode参数的赋值为独占方式
dm_Main->ado_Conn->LoginPrompt =false;
2,执行修改的sql语句在bcb环境下不要包含参数。
代码
//首先先看一段我之前的错误代码
ado_Query_Set->Connection = dm_Main->ado_Conn;
ado_Query_Set->Close();
ado_Query_Set->SQL->Clear() ;
ado_Query_Set->Parameters->Clear();
ado_Query_Set->SQL->Add("alter database password :new :old") ;
ado_Query_Set->Parameters->ParamByName("new")->Value = edt_NewDBPWD->Text.Trim() ;
ado_Query_Set->Parameters->ParamByName("old")->Value = edt_OldDBPWD->Text.Trim() ;
if(ado_Query_Set->ExecSQL()>0)
{
ShowMessage("数据库密码修改成功,请使用新密码");
}
//这里我的逻辑没有问题,但是却用了参数方式执行
//那么我们来看正确代码
ado_Query_Set->Connection = dm_Main->ado_Conn;
ado_Query_Set->Close();
ado_Query_Set->SQL->Clear() ;
ado_Query_Set->SQL->Text = String().sprintf(
TEXT("alter database password [%s] [%s]"),
edt_NewDBPWD->Text.Trim(), edt_OldDBPWD->Text.Trim());
ado_Query_Set->ExecSQL();
ShowMessage("数据库密码修改成功,请使用新密码");
//错误代码和正确代码有2个细节区别,
//1是正确代码没有用Parameters参数查询,
//2是正确代码里ado_Query_Set->ExecSQL()没有判断返回值。
//因为alter database是无返回值的,所以这里我们需要用try catch捕捉下异常来判断即可。
ado_Query_Set->Connection = dm_Main->ado_Conn;
ado_Query_Set->Close();
ado_Query_Set->SQL->Clear() ;
ado_Query_Set->Parameters->Clear();
ado_Query_Set->SQL->Add("alter database password :new :old") ;
ado_Query_Set->Parameters->ParamByName("new")->Value = edt_NewDBPWD->Text.Trim() ;
ado_Query_Set->Parameters->ParamByName("old")->Value = edt_OldDBPWD->Text.Trim() ;
if(ado_Query_Set->ExecSQL()>0)
{
ShowMessage("数据库密码修改成功,请使用新密码");
}
//这里我的逻辑没有问题,但是却用了参数方式执行
//那么我们来看正确代码
ado_Query_Set->Connection = dm_Main->ado_Conn;
ado_Query_Set->Close();
ado_Query_Set->SQL->Clear() ;
ado_Query_Set->SQL->Text = String().sprintf(
TEXT("alter database password [%s] [%s]"),
edt_NewDBPWD->Text.Trim(), edt_OldDBPWD->Text.Trim());
ado_Query_Set->ExecSQL();
ShowMessage("数据库密码修改成功,请使用新密码");
//错误代码和正确代码有2个细节区别,
//1是正确代码没有用Parameters参数查询,
//2是正确代码里ado_Query_Set->ExecSQL()没有判断返回值。
//因为alter database是无返回值的,所以这里我们需要用try catch捕捉下异常来判断即可。
这里感谢妖哥的指点,才晓得这个细节。特分享给大家。