ADOQuery1.ExecSQL与ADOQuery1.Open有什么区别?还有以下代码有什么问题,为什么一运行到ADOQuery1.ExecSQl就出现:Project raised exception class EAccessViolation with message 'Access Violation at address 1F453E7E in module 'msado15.dll'.write of address 015A9000'.Process stopped.错误提示。
代码如下:
procedure TForm1.N1Click(Sender: TObject);
   var  SrChannel,srFile : TSearchRec;
        Err,Err2 : integer;
         ChannelPath : string;
        AdoTableFiles:TADOTable;
     //将VideoRoot目录下的文件导入vod.mdb中的table files中
Begin
  //删除原来的记录
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('delete from files');
  ADOQuery1.ExecSQL;
  ADOQuery1.Close;  AdoTableFiles:= TADOTable.Create(Form1);
  AdoTableFiles.Connection:=ADOConnection1;
  AdoTableFiles.TableName:='files';
  AdoTableFiles.active:=true; Err:=FindFirst(VideoRoot+'\*.*',faDirectory ,SrChannel) ;
 While (Err = 0) do
  begin
      //读出一个频道名
   if SrChannel.Name[1]<>'.' then
     begin
      ChannelPath:=VideoRoot+'\'+SrChannel.Name;
     
      // 读出该频道下的所有文件
      Err2:= FindFirst(ChannelPath+'\*.*', faAnyFile ,SrFile);
        While (Err2 = 0) do
          begin
           If ((SrFile.Attr and faDirectory)=0) then
              begin
            AdoTableFiles.Insert;
            AdoTableFiles.FieldByName('频道').AsString:= SrChannel.Name;
            AdoTableFiles.FieldByName('文件').AsString:= SrFile.Name;
            AdoTableFiles.FieldByName('节目').AsString:= SrFile.Name;
            AdoTableFiles.FieldByName('大小').AsInteger:= SrFile.size;
            AdoTableFiles.Post;
end;
            Err2:=FindNext(SrFile) ;
end;
         FindClose(SrFile);
end;     Err:=FindNext(SrChannel) ;
end ;
 FindClose(SrChannel); AdoTableFiles.Close;
 AdoTableFiles.free;   //从files 导入 programs ,channels
  with   ADOQuery1 do
    begin
        SQL.Clear;
        SQL.Add('delete from channels ');
        ExecSQL;
        Close;        SQL.Clear;
        SQL.Add('insert into channels (频道) select distinct 频道 from files ');
        ExecSQL;
        Close;        SQL.Clear;
        SQL.Add('DELETE FROM programs WHERE 频道+''\''+文件 not in (select 频道+''\''+文件 from files)');
        ExecSQL;
        Close;        SQL.Clear;
        SQL.Add('INSERT INTO  programs(节目,频道, 文件, 大小) '+
              ' SELECT files.节目, files.频道, files.文件, files.大小 '+ ' FROM files LEFT JOIN programs ON ((files.文件 = programs.文件) and (files.频道 = programs.频道))'+ ' WHERE (((programs.文件) Is Null) and ((programs.频道) Is Null)) ');
        ExecSQL;
        Close;
  end ;
  ADOConnection1.Close;
  ADOConnection1.open;
  if (not ADOConnection1.Connected) then ADOConnection1.Connected:=True;
  AdoTablePrograms.Active:=true;
   ImportChannel;
   ADOTablePrograms.Refresh;
   CreateMediaList;
   TabSheetProgram.Show;
end;

解决方案 »

  1.   

    我的理解:execsql和open的区别,当执行sql语句时不需要返回值,像delete等语句时你就得用execsql,用open好像就不可以。但如果有返回值用它们都可以,还可以用adoquery.active:=true.
    关于上面代码,你在用adquery前应该先将其close,然后再sql.clear....sql.execsql.
      

  2.   

    我已改正了先Close的这个问题,但错误照就。请继续请教。
      

  3.   


    1.  //删除原来的记录
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add('delete files');////////////没有from吧
      ADOQuery1.ExecSQL;
    2.在所有SQL.Clear前,应该先Close
      

  4.   

    你先确保adoquery1与数据库联接上了。还有你用的是delphi5,还是6,如果是5,你得将它的ado升级,还有mdac.
      

  5.   

    execsql是执行delete,insert的,open 是执行select