Access数据库中使用update出错
我有两个数据库,名称和结构、数据样例如下:
User1.mdb 
UserID  UserName  ReportCount  …………
某某      王一     23           …………
某某      马二     45           …………
某某      张三     26           …………
某某      李四     78           …………
某某      胡五     25           …………
Report.mdb
Author   title   …………
王一      某某   …………
马二      某某   …………
马二      某某   …………
张三      某某   …………
张三      某某   …………
张三      某某   …………
赵六      某某   …………
赵六      某某   …………
许七      某某   …………
许七      某某   …………
如上所见,数据库User1的字段ReportCount记录的是Report数据库的Author的文章数。
现在我面临的困扰是,两个数据库的记录不统一,需要整理。我需要在User1中查看,如果Report数据库中的文章数不正确,则统计添加。
我用的是Access数据库。我用了如下语句:
procedure TAutoArticlecount_Form.BitBtn1Click(Sender: TObject);
var
sqlstr:string;
begin
  if ADOTable1.eof=false then
  with ADOQuery1 do
  begin
    SQL.Clear;
    sqlstr:='update User1 set User1.ReportCount=( select count(Author) from  Report  where Report.Author=User1.UserName )';
    SQL.Add(sqlstr);
    showmessage(sqlstr);
    ExecSQL;
  end;
  ADOTable1.Refresh ;
  DBGrid1.DataSource :=DataSource1;
end;结果出现出错提示:
Operation must use an updateable query 请问我出了什么错,应该如何修改呢?

解决方案 »

  1.   

    update User1 set User1.ReportCount=( select count(report.Author) from  Report,user1  where Report.Author=User1.UserName
      

  2.   

    回复一:还是不行,错误仍在。
    回复二:不支持复合SQL语句,默……那,要达到我希望的目的,该如何是好?
      

  3.   

    分开来了,虽然速度可能慢点。
    while not ADOTable1.eof do 
    begin
        ADOQuery1.sql.text :='select Count(Author) as T from report where Auther=:A';
        AdoQuery1.parameter.parameterByName('A').value=AdoTable1.FieldByName
                                                      ('UserName').asstring;
        AdoQuery1.open;
        if AdoQuery1.FieldByName('T').asInteger<>AdoTable.FieldByName('').asInteger then begin
        //更新
    end;
        AdoTable.next;
    end;
      

  4.   

    更新……如何更新,不是不能用update了吗?
      

  5.   

    adoquery1.close;
    adoquery1.sql.text := 'select username, reportcount from user1';
    adoquery1.open;
    adoquery1.first;
    while not adoquery1.eof do
    begin
      adoquery2.close;
      adoquery2.sql.text := 'select count(*) as num from report where author = ' + quotedsrt(varrostr(adoquery1.fieldvalues['username']));
      adoquery2.open;
      if varrostr(adoquery1.fieldvalues['reportcount']) <> varrostr(adoquery2.fieldvalues['num']) then
      begin
        adoquery3.close;
        adoquery3.sql.text := 'update user1 set reportcount = ' + varrostr(adoquery2.fieldvalues['num']) + ' where name = ' + quotedsrt(varrostr(adoquery1.fieldvalues['username']));
        adoquery3.execsql;
      end;  adoquery1.next;
    end;
      

  6.   

    for i:=0 to  ADOTable1.FieldCount-1 do
      begin
          ADOQuery1.close;
          ADOQuery1.SQL.Clear;
          sqlstr:='select *  from Article where Author=';
          sqlstr:=sqlstr+Label3.Caption+DBEdit1.text+Label3.Caption;
          ADOQuery1.SQL.Add(sqlstr);
          ADOQuery1.ExecSQL;
          ADOQuery1.open;
          ADOTable1.edit;
          DBEdit3.Text:=inttostr(DataSource2.DataSet.RecordCount) ;
          ADOTable1.Post ;
          ADOTable1.next;
      end;
    以上,运行通过,简单的说,我用的是DataSource2.DataSet.RecordCount统计。