首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

AdoQuery修改access数据库密码的有关问题

2012-02-02 
AdoQuery修改access数据库密码的问题C/C++ codeado_Query_Set-Connection dm_Main-ado_Connado_Query

AdoQuery修改access数据库密码的问题

C/C++ code
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("数据库密码修改成功,请使用新密码");}


老是报错说“需要密码”什么的。请教下大家,是哪里出了问题?

[解决办法]
用ACCESS密码查看器之类的破解密码后另存为,就可以了
[解决办法]
网上找的代码,我没有测试过
Delphi(Pascal) code
1.Delphi中操作Access数据库(建立.mdb文件,压缩数据库) 
以下代码在WIN2K,D6,MDAC2.6下测试通过,
编译好的程序在WIN98第二版无ACCESS环境下运行成功.
//在之前uses ComObj,ActiveX
//声明连接字符串
Const
SConnectionString    = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;'
                +'Jet OLEDB:Database Password=%s;';

//=============================================================================
// Procedure: GetTempPathFileName
// Author  : ysai
// Date  : 2003-01-27
// Arguments: (None)
// Result  : string
//=============================================================================

//取得临时文件名
var
SPath,SFile:array [0..254] of char;
begin
GetTempPath(254,SPath);
GetTempFileName(SPath,'~SM',0,SFile);
result:=SFile;
DeleteFile(PChar(result));
end;

//=============================================================================
// Procedure: CreateAccessFile
// Author  : ysai
// Date  : 2003-01-27
// Arguments: FileName:String;PassWord:string=''
// Result  : boolean
//=============================================================================
function CreateAccessFile(FileName:String;PassWord:string=''):boolean;
//建立Access文件,如果文件存在则失败
var
STempFileName:string;
VCatalog:OleVariant;
begin
STempFileName:=GetTempPathFileName;
try
  vCatalog:=CreateOleObject('ADOX.Catalog');
  vCatalog.Create(format(SConnectionString,[STempFileName,PassWord]));
  result:=CopyFile(PChar(STempFileName),PChar(FileName),True);
  DeleteFile(STempFileName);
except
  result:=false;
end;
end;

//=============================================================================
// Procedure: CompactDatabase
// Author  : ysai
// Date  : 2003-01-27
// Arguments: AFileName,APassWord:string
// Result  : boolean
//=============================================================================
function CompactDatabase(AFileName,APassWord:string):boolean;
//压缩与修复数据库,覆盖源文件
var
STempFileName:string;
vJE:OleVariant;
begin
STempFileName:=GetTempPathFileName;
try
  vJE:=CreateOleObject('JRO.JetEngine');
  vJE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
    format(SConnectionString,[STempFileName,APassWord]));
  result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
  DeleteFile(STempFileName);
except
  result:=false;
end;
end;

//=============================================================================
// Procedure: ChangeDatabasePassword


// Author  : ysai
// Date  : 2003-01-27
// Arguments: AFileName,AOldPassWord,ANewPassWord:string
// Result  : boolean
//=============================================================================
function ChangeDatabasePassword(AFileName,AOldPassWord,ANewPassWord:string):boolean;
//压缩数据库并修改ACCESS数据库密码
var
STempFileName:string;
vJE:OleVariant;
begin
STempFileName:=GetTempPathFileName;
try
  vJE:=CreateOleObject('JRO.JetEngine');
  vJE.CompactDatabase(format(SConnectionString,[AFileName,AOldPassWord]),
    format(SConnectionString,[STempFileName,ANewPassWord]));
  result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
  DeleteFile(STempFileName);
except
  result:=false;
end;
end;


以下SQL语句在ACCESS XP的查询中测试通过
建表:
  Create Table Tab1 (
    ID Counter,
    Name string,
    Age integer,
    [Date] DateTime);
技巧:
  自增字段用 Counter 声明.
  字段名为关键字的字段用方括号括起来,数字作为字段名也可行.

建立索引:
  下面的语句在Tab1的Date列上建立可重复索引
  Create Index iDate ON Tab1 ([Date]);
  完成后ACCESS中字段Date索引属性显示为 - 有(有重复).
  下面的语句在Tab1的Name列上建立不可重复索引
  Create Unique Index iName ON Tab1 (Name);
  完成后ACCESS中字段Name索引属性显示为 - 有(无重复).
  下面的语句删除刚才建立的两个索引
  Drop Index iDate ON Tab1;
  Drop Index iName ON Tab1;

ACCESS与SQLSERVER中的UPDATE语句对比:
  SQLSERVER中更新多表的UPDATE语句:
  UPDATE Tab1
  SET a.Name = b.Name
  FROM Tab1 a,Tab2 b
  WHERE a.ID = b.ID;
  同样功能的SQL语句在ACCESS中应该是
  UPDATE Tab1 a,Tab2 b
  SET a.Name = b.Name
  WHERE a.ID = b.ID;
即:ACCESS中的UPDATE语句没有FROM子句,所有引用的表都列在UPDATE关键字后.
上例中如果Tab2可以不是一个表,而是一个查询,例:
  UPDATE Tab1 a,(Select ID,Name From Tab2) b
  SET a.Name = b.Name
  WHERE a.ID = b.ID;

访问多个不同的ACCESS数据库-在SQL中使用In子句:
  Select a.*,b.* From Tab1 a,Tab2 b In 'DB2.mdb' Where a.ID=b.ID;
  上面的SQL语句查询出当前数据库中Tab1和db2.mdb(当前文件夹中)中Tab2以ID为关联的所有记录.
缺点-外部数据库不能带密码.
补充:看到ugvanxk在一贴中的答复,可以用
  Select * from [c:\aa\a.mdb;pwd=1111].table1;
ACCESS XP测试通过

在ACCESS中访问其它ODBC数据源
下例在ACCESS中查询SQLSERVER中的数据
  SELECT * FROM Tab1 IN [ODBC]
  [ODBC;Driver=SQL Server;UID=sa;PWD=;Server=127.0.0.1;DataBase=Demo;]
外部数据源连接属性的完整参数是:
  [ODBC;DRIVER=driver;SERVER=server;DATABASE=database;UID=user;PWD=password;]
其中的DRIVER=driver可以在注册表中的
  HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\
中找到
异构数据库之间导数据参见 碧血剑 的
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966

ACCESS支持子查询

ACCESS支持外连接,但不包括完整外部联接和多外连接,如支持
  LEFT JOIN 或 RIGHT JOIN
但不支持
  FULL OUTER JOIN 或 FULL JOIN

ACCESS中的日期查询
注意:ACCESS中的日期时间分隔符是#而不是引号
  Select * From Tab1 Where [Date]>#2002-1-1#;
在DELPHI中我这样用
  SQL.Add(Format(
    'Select * From Tab1 Where [Date]>#%s#;',
    [DateToStr(Date)]));

ACCESS中的字符串可以用双引号分隔,但SQLSERVER不认,所以为了迁移方便和兼容,
建议用单引号作为字符串分隔符.

ACCESS的约束
在JET SQL参考中关于约束的内容不够详细,可以参考SQL Server的联机丛书
下面的SQL为a表的Name字段增加非空约束
ALTER TABLE a ADD CONSTRAINT a_checkname CHECK (Not [Name] is Null)
注意:每一个约束都是一个对象,都有一个名字

为一个表设置主键
下面的语句把id列设置为主键
Alter Table [表] Add Primary Key (Id)
下面的语句把id列改为自动编号类型,并且设置为主键
Alter Table [表] Alter [id] Counter Constraint [表_p] Primary Key

修改ACCESS数据库的密码
//引用ComObj单元

//=============================================================================


// Procedure: ChangeAccessPassword
// Author  : ysai
// Date  : 2004-02-10
// Arguments: const AFileName : string; const AOldPassword : string; const ANewPassword : string
// Result  : Boolean
//=============================================================================

  const AFileName : string;
  const AOldPassword  : string;
  const ANewPassword  : string
  ):Boolean;

const
SAlterDatabasePassword  = 'ALTER DATABASE PASSWORD %s %s';
var
acn  : OleVariant;
sOld  : string;
sNew  : string;
begin
if AOldPassword = '' then
  sOld  :=  'Null'
else
  sOld  :=  '[' + AOldPassword + ']';
if ANewPassword = '' then
  sNew  :=  'Null'
else
  sNew  :=  '[' + ANewPassword + ']';
try
  acn :=  CreateOleObject('ADODB.Connection');
  //Delphi中的cmShareExclusive,ADO中的adModeShareExclusive
  //用排它方式打开,直接用数字可以不用引用ADO单元
  acn.Mode  :=  12;
  acn.Provider := 'Microsoft.Jet.OLEDB.4.0';
  acn.Properties('Jet OLEDB:Database Password') := AOldPassword;
  acn.Open('Data Source=' + AFileName);
  try
  acn.Execute(Format(SAlterDatabasePassword,[sNew,sOld]));
  finally
  acn.Close;
  end;
  Result  :=  True;
except
  Result  :=  False;
end;
end;


[解决办法]
这个问题很奇怪。alter database password语句居然不能用参数代入。改成:
C/C++ code
ADOQuery1->SQL->Text = String().sprintf(        TEXT("alter database password [%s] [%s]"),        edt_NewDBPWD->Text.Trim(), edt_OldDBPWD->Text.Trim());
[解决办法]
哥们,你ado_Query_Set->Parameters->Clear();
你在哪里创建的参数呢?

热点排行