C++ Builder修改Access数据库密码

来源:互联网 发布:linux双网卡绑定配置 编辑:程序博客网 时间:2024/05/23 01:18
void __fastcall TForm1::Button1Click(TObject *Sender){    AnsiString   f1= "AccoutMe.mdb ";           //   源库1    AnsiString   psw1= "123456";                //   密码1,若设置错误也会报“意外错误”    AnsiString   f2= "AccoutMe_new.mdb ";       //   源库2    AnsiString   psw2= "abc";                   //   新密码2    bool flg_Success = false;    AnsiString   dir = ExtractFilePath(Application-> ExeName);    f1=dir+f1;                              //新数据库绝对路径    f2=dir+f2;    if (FileExists( f2 ) )      //若目标文件已存在,先删除            DeleteFileA(f2);    char Provider1[512] = { 0 }, Provider2[512] = { 0 };    sprintf(Provider1,            "Provider=Microsoft.Jet.OLEDB.4.0;"             "Data Source='%s';"             "Jet OLEDB:Database Password='%s'" , f1, psw1           );//    sprintf(Provider2,//            "Provider=Microsoft.Jet.4.0.OLE DB.Provider;"//            "Data Source='%s';"//            "Jet OLEDB:Database Password='%s'"//            , f2, psw2//            );   // 注意提供正确的Provider写法,否则提示“意外错误”    sprintf(Provider2,            "Provider=Microsoft.Jet.OLEDB.4.0;"            "Data Source='%s';"            "Jet OLEDB:Database Password='%s'" , f2, psw2           );    Variant Adoobj = Variant::CreateObject( "JRO.JetEngine");        try    {        Adoobj.OleProcedure( "CompactDatabase", WideString(Provider1), WideString(Provider2) );        if (FileExists(f1))            DeleteFileA(f1);        RenameFile(f2, f1);        flg_Success = true;    }    __finally    {        Adoobj.Clear();        Adoobj = Unassigned;    }    ShowMessage( BoolToStr(flg_Success, true) ) ;}


这是OLE的方法,由于代码较简洁就不多写注释了。

原帖子见:http://topic.csdn.net/u/20120214/17/6bde8f44-3afb-4f8d-afc1-f971c879e3d9.html 

特别感谢老妖!

 

PS:

OLE报错太不友好了。

不论是用独占方式打开ACCESS用SQL语句ALTER DATABASE PASSWORD "旧密码"   "新密码",

还是用ADOQuery等控件,设置独占打开方式和 ADO 控件的SQL属性为"alter…………"修改ACCESS密码,都没有成功。

调试中ing...