用了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捕捉下异常来判断即可。
这里感谢妖哥的指点,才晓得这个细节。特分享给大家。