这十个数据库名称分别为c:\1.mdb,c:\2.mdb,...,c:\10.mdb;密码均为0000
如果发现有这两个字,就把它替换成为"文章"并保存之...并把修改的情况列到memo1中显示.
显示格式如:
数据库1.mdb中的表a中的x字段原为...,其中需要修改部分已作修改.
....
可以用BDE或者ADO连接来实现.有没有高手能够做到?

解决方案 »

  1.   

    其实很简单就是比较麻烦一点
    var
    i,j:integer;
    begin
    for j:=0 to dataset.recored-1 do begin
    for i:=0 to dataset.FieldCount-1 do begin
    if dataset.filedByName(dataset.Fields.Fields[i].DisplayText).DataType=ftMemo then
    begin
    if pos('主题',(Trim(dataset.fields.fields[i].value))>0 
    begin
    {替换你所要的字符串
    MEMO显示你想要的结果}
    end;
    end;
    end;
    end;
    end;
    这是一个库的,你循环写10个库的就可以了,因为有雷同之处,
    其实你仔细琢磨一下,应该很简单。
      

  2.   

    不对,你这是一个表的.不是一个库的.
    我的想法是这样的,用ADO动态连接x.mdb(最外层循环),通过某种方式取得ADO连接数据库的TABLE列表,对每个表先select top 1 * from 表,先取得文本类型和备注类型的字段列表放至string astrlist[],再select * from 表 where astrlist[x]='%文章%' or astrlist[x+1]='%文章%'.....
    一有记录返回就再行操作...现在最大的问题是怎么取得ADO连接数据库的TABLE列表,其它都可以解决.
      

  3.   

    啊,还有一个问题,用BDE的DATASET连接时怎么处理ACCESS的密码验证?
      

  4.   

    如果是DATABASE的话,能够取得TABLE列表.
      

  5.   

    这好办
    1、外循环为10个库(这个简单,不说了)
    2、取出每个库中的表
    测试情况:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      s : Tstringlist;
    begin
      s:=Tstringlist.Create;
      ADOConnection1.GetTableNames(s);
      showmessage(s.Text);
    end;
    3、然后读s(最好把s设置为全局变量) 
      if s.Count>0 then
      begin
        for i:=0 to s.count-1 do
        begin
          table :=s[i];
          .....
        end;
      end;
    4、hsmserver(小霍)说的
    如果还是不明白的话,晚上不加班的话再来
      

  6.   

    function TForm1.ReplaceDBStr(acon: tadoconnection; const src, dest: string;
      Rt: Tstrings): integer;
    var
      i,j:integer;
      Afields:string;
      Atables:tstrings;
      aq:tadoquery;
    begin
      Atables:=tstringlist.Create;
      try
      aq:=tadoquery.Create(nil);
      try
      aq.Connection:=acon;
      acon.GetTableNames(Atables,false);
      Result:=0;
      for i:=0 to Atables.Count-1 do
      begin
        aq.Close;
        aq.sql.Text:='select top 1 * from '+Atables.Strings[i];
        aq.Open;
        if aq.Eof then continue;
        Afields:='select * from '+Atables.Strings[i]+' where ';
        for j:=0 to aq.FieldCount-1 do
        begin
          if aq.Fields.Fields[j].DataType in [ftmemo,ftString] then
            Afields:=Afields+'('+aq.Fields.Fields[j].FieldName+' like ''*'+src+'*'' )or';
        end;
        if Afields='select * from '+Atables.Strings[i]+' where ' then continue;
        delete(Afields,Length(Afields)-1,2);
        aq.Close;
        aq.SQL.Text:=Afields;
        aq.Open;
        if aq.Eof then continue;
        //发现目标
        aq.First;
        while not aq.Eof do
        begin
          for j:=0 to aq.FieldCount-1 do
          begin
            if(aq.Fields.Fields[j].DataType in [ftmemo,ftString])and
              (pos(src,(Trim(aq.Fields.fields[j].AsString)))>0)then
            begin
              aq.Edit;
              StringReplace(aq.Fields.Fields[j].AsString,src,dest,[rfReplaceAll]);
              aq.Post;
              rt.Add(Atables.Strings[i]+'....'+aq.Fields.Fields[j].FieldName);
              inc(result);
            end;
          end;
          aq.Next;
        end;
      end;
      finally
      aq.Free;
      end;
      finally
      Atables.Free;
      end;
    end;
    这样似乎并不行!!!没有改写到!
      

  7.   

    我改了两个地方,就是两个aq.Fields.Fields[j].DataType in [ftmemo,ftString]
    改成:aq.Fields.Fields[j].DataType in [ftmemo,ftWideString]),但还是不行,
    在if Afields='select * from '+Atables.Strings[i]+' where ' then continue;
        delete(Afields,Length(Afields)-1,2);
    aq.Close;
    aq.SQL.Text:=Afields;
    aq.Open;//<---------------------此处打开之后记录总是为0,但我在ACCESS中运行过生成的SQL语句,并不会这样呀.
    if aq.Eof then continue;//<---这里就会自动跳出.
    //发现目标
      

  8.   

    你做的已经很好了,还差一点点
    if(aq.Fields.Fields[j].DataType in [ftmemo,ftString])and
    该为
    if(aq.Fields.Fields[j].DataType in [ftWideString]) and
    你再试一试
    我测试了一下,行
      

  9.   

    跟普通的查詢修改一樣嘛~~---------------------------------------------
    最新發現:免費發短信的軟件~~不信試試~~
    請到下面的網址下載吧~~
    http://www.m2p.com.cn/download.asp?no=m2px9m
      

  10.   

    aq.sql.text:='select * from Bbsz where (Blx like "*凭证*")or(Bh like "*凭证*")or(Mc like "*凭证*")or(xls like "*凭证*")';
    aq.open;
    这样为什么也会记录为空呢,我试过直接复制语句到ACCESS中运行,是有四条结果的!
      

  11.   

    我做了一个数据库的小测试,已经通过
    procedure TForm1.Button1Click(Sender: TObject);
    var
      s : Tstringlist;
      i,j ,k: integer;
      adoquery2 : Tadoquery;
      savestring : string;
      updatestr : string;
    begin
      s:=Tstringlist.Create;
      ADOConnection1.GetTableNames(s);
      try
        adoquery2 :=Tadoquery.Create(self);
        adoquery2.Connection:=ADOConnection1;
        for i:=0 to s.Count-1 do
        begin
          ADOQuery1.Close;
          ADOQuery1.SQL.Clear;
          ADOQuery1.SQL.Text:='select * from '+s[i];
          ADOQuery1.Open;
          while not ADOQuery1.Eof do
          begin
            for j:=0 to ADOQuery1.FieldCount-1 do
            begin
              if (ADOQuery1.Fields[j].DataType in [ ftMemo,ftWideString ])  then
              begin
                if pos('主题',ADOQuery1.fieldbyname(ADOQuery1.Fields[j].DisplayName).AsString)>0 then
                begin
                  savestring:=ADOQuery1.fieldbyname(ADOQuery1.Fields[j].DisplayName).AsString;
                  updatestr:=copy(savestring,1,pos('主题',savestring)-1)+'文章'+
                             copy(savestring,pos('主题',savestring)+4,length(savestring));
                  adoquery2.Close;
                  adoquery2.SQL.Clear;
                  adoquery2.SQL.Text:='update  '+s[i]+' set '+ADOQuery1.Fields[j].DisplayName+' ='''+updatestr +
                                      '''  where id = '+ADOQuery1.fieldbyname('id').AsString;
                  adoquery2.ExecSQL;              memo1.Lines.Add('ID号 '+ ADOQuery1.fieldbyname('id').AsString +' :'+ savestring+' --> '+updatestr);
                end;
              end;                                           
            end;
            ADOQuery1.Next;
          end;
        end;
      finally
        freeandnil(adoquery2);
      end;
    end;
      

  12.   

    aq.sql.text:='select * from Bbsz where (Blx like ''%凭证%'')or(Bh like ''%凭证%'')or(Mc like ''%凭证%'')or(xls like ''%凭证%'')';
      

  13.   

    可以了,我还记得是百分号的,但在ACCESS中却不行要用*号.怎么这么奇怪.