数据库操作在BDE里可以,在ADO里为什么不行了呢?请指示(100分)

  • 主题发起人 主题发起人 小刚
  • 开始时间 开始时间

小刚

Unregistered / Unconfirmed
GUEST, unregistred user!
//用ADO 数据库为Access
with Query1 do begin
SQL.Clear;
SQL.Add('PARAMETERS [_XBH] Short;');
SQL.Add('Update Db1 SET GCL=GCL+(SELECT Gcl_SUM FROM Db2 WHERE Db2.XBH=[_XBH]) ');
SQL.Add('WHERE Db1.XBH=[_XBH]');
Parameters.ParamValues['_XBH'] :=iTmp;
ExecSQL;//提示错误:“操作必须是一个可更新的查询”
end;
//为什么用Ado的不行,而用下面的方法又可以呢?

with ADOQuery1 do begin
//用BDE 数据库为Paradox
SQL.Clear;
SQL.Add('Update Db1 SET GCL=GCL+(SELECT Gcl_SUM FROM Db2 WHERE Db2.XBH=:_XBH)';
SQL.Add('WHERE db1.XBH=:_XBH');
ParamByName('_XBH').AsInteger :=iTmp;
ExecSQL;
end;

帮帮我,我该用什么办法达到我的要求?
 
注意,你上面写的是ACCESS查询中的语句吧,不能照搬到DELPHI中来的
//上面这句不要 SQL.Add('PARAMETERS [_XBH] Short;');
SQL.Add('Update Db1 SET GCL=GCL+(SELECT Gcl_SUM FROM Db2 WHERE Db2.XBH=:XBH) ');
SQL.Add('WHERE Db1.XBH=:XBH');
 
呵呵,都不用声明参数的
 
SQL.Add('Update Db1 SET GCL=GCL+(SELECT Gcl_SUM FROM Db2 WHERE Db2.XBH=:XBH1)');
SQL.Add('WHERE Db1.XBH=:XBH2');
Parameters.ParamValues['_XBH1'] :=iTmp;
Parameters.ParamValues['_XBH2'] :=iTmp;

 
SQL.Add('Update Db1 SET GCL=GCL+(SELECT Gcl_SUM FROM Db2 WHERE Db2.XBH=:XBH1)');
SQL.Add('WHERE Db1.XBH=:XBH2');
Parameters.Parambynaem('_XBH1') :=iTmp;
Parameters.Parambynaem('_XBH2') :=iTmp;
 
to All:后来我仔细看了我提问题的代码,而且在D6里实验了,并不是这句:
SQL.Add('PARAMETERS [_XBH] Short;');
的问题,问题出在Access数据库本身,希望各位验证以后再作答。
用这个代码完全通过(D6+Access2000):

//用ADO 数据库为Access
var
iTmp:integer;
begin
with Query1 do begin
SQL.Clear;
SQL.Add('PARAMETERS X Short;');
SQL.Add('Update Db1 SET GCL=GCL+[X] ');
SQL.Add('WHERE Db1.XBH=1000');
Parameters.ParamValues['X'] :=iTmp;
ExecSQL;
end;
end;

 
多人接受答案了。
 
后退
顶部