Delphi中怎样改变数据库文件密码?(100分)

  • 主题发起人 主题发起人 Dale46
  • 开始时间 开始时间
D

Dale46

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样在Delphi程序运行中 怎样改变已设定密码的数据库文件的密码?
如原密码 abc, 怎样让用户在程序运行中改为 efg.
 
tsession.removepassword
tsession.addpassword

never tried
 
session.removepassword
session.addpassword
这仅仅是告诉程序密码已被输入,而不必在程序执行期间不断地询问密码.
而不是改变密码.
 
oh, see , sorry, thanx
 
用 BDE API :DbiDoRestructure

看看Delphi BDE help就知道了,全在里面
 
procedure AddPasswordToTable(Tbl: TTable; Password: String);
var
hDb: hDbiDb;
TblDesc: CRTblDesc;
VChk: pVChkDesc;
Dir: String;
NumVChks: Word;
OpType: CROpType;
begin
NumVChks := 0;
SetLength(Dir, dbiMaxNameLen + 1);
Check(DbiGetDirectory(Tbl.DBHandle, False, PChar(Dir)));
SetLength(Dir, StrLen(PChar(Dir)));
VChk := AllocMem(sizeof(VChkDesc));
try
FillChar(TblDesc, sizeof(CRTblDesc), #0);

Tbl.DisableControls;
Tbl.Close;
Check(DbiOpenDatabase(nil, nil, dbiReadWrite, dbiOpenExcl, nil, 0, nil, nil, hDb));
Check(DbiSetDirectory(hDb, PChar(Dir)));
TblDesc.iValChkCount := NumVChks;
TblDesc.pVChkDesc := VChk;
OpType := crMODIFY;
TblDesc.pecrValChkOp := @OpType;

StrPCopy(TblDesc.szTblName, Tbl.TableName);
StrCopy(TblDesc.szTblType, szParadox);
StrPCopy(TblDesc.szPassword, Password);
TblDesc.bProtected := Password <> '';
Check(DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, False));
finally
Check(DbiCloseDatabase(hDb));
FreeMem(VChk, sizeof(VChkDesc));
Session.AddPassword(Password);
Tbl.EnableControls;
Tbl.Open;
end;
end;

 
这样改变密码:
procedure SetNewPassword(ATable: TTable; OldP, NewP: String);
begin
if OldP = NewP then Exit;
Session.AddPassword(OldP);
AddPasswordToTable(ATable, NewP);
// Session.RemoveAllPasswords;
end;
很久以前的代码,摘抄时没有测试。
 
croco:
AddPasswordToTable in where?
 
再望上看一层。
 
hi croco
sorry! why:
hDb: hDbiDb;
TblDesc: CRTblDesc;
VChk: pVChkDesc;
OpType: CROpType;
数据类型定义无法通过编译?
 
interface
uses
bde;

procedure _AddNewPassword(dbname:string;Password:String='700203');
const
RESTRUCTURE_TRUE = WordBool(1);
var
TblDesc: CRTblDesc;
hDb: hDBIDb;
temptable:ttable;
begin
temptable:=Ttable.Create(application);
temptable.DatabaseName:='DBDEMOS';
temptable.TableType:=ttParadox;
temptable.TableName:=dbname;
temptable.Exclusive:=true;
temptable.open;
FillChar(TblDesc,SizeOf(CRTblDesc),0);
with TblDesc do
begin
{ 把表名放到描述区 }
StrPCopy(szTblName, temptable.tableName);
{ 把表类型放到描述区 }
StrCopy(szTblType, szPARADOX);
StrPCopy(szPassword, Password);
{ 设置BPROTECTED为TRUE }
bProtected := RESTRUCTURE_TRUE;
end;
{ 从当前的HANDLE里得到DATABASE的HANDLE }
Check(DbiGetObjFromObj(hDBIObj(temptable.Handle), objDATABASE, hDBIObj(hDb)));
{ 关闭表 }
temptable.Close;
temptable.free;
{ 添加主口令到PARADOX表里}
Check(DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, FALSE));
{添加一个新口令到SESSION}
Session.AddPassword(Password);
end;

该程序在delphi4.0版本下调试运行通过!
 
多人接受答案了。
 
后退
顶部