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参数的赋值为独占方式

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捕捉下异常来判断即可。

 这里感谢妖哥的指点,才晓得这个细节。特分享给大家。


 

 

posted on 2010-07-27 16:42  李福伟  阅读(906)  评论(0编辑  收藏  举报

导航