implementation
procedure TForm2.search();//把最终查询结果显示到memeo中
var
        sFile:string; //图片存取路径和名称
begin
        num:=0;
        ZhName:='';
        JieName:='';
        try
              ZhName:=Query2.FieldByName('zh_name').AsString;
              JieName:=Query1.FieldByName('j_num').AsString;
              //Query1.First;
              count:= Query2.fieldbyname('JiLu_num').AsInteger;
              Query1.MoveBy(count);              while not Query2.Eof do
                        if  OK='0' then
                                if Query2.FieldByName('flag').AsString='0' then
                                        begin
                                                DBMemo1.Lines.Add(Query2.FieldByName('document').AsString);                                                Next;
                                                num:=num+1;
                                                count:=count+1;
                                                continue;
                                        end  //end flag 0
                                        else if Query1.fieldbyname('flag').AsString='1' then
                                                begin
                                                        OK:='1'; //修改显示暂停标志为1——暂停
                                                        sFile:=Query2.fieldbyname('document').AsString;//取要加载的图片的路径和名称
                                                        Image1.Picture.LoadFromFile(sFile);   //动态加载.bmp图片
                                                        showmessage('如右图所示');
                                                        num:=num+1;
                                                        count:=count+1;
                                                end  //end flag 1
                                                else if Query2.fieldbyname('flag').AsString='3' then
                                                        begin
                                                                 OK:='1';  //修改显示暂停标志为1——暂停
                                                                 PlayDocument.Enabled:=true;
                                                                 filename:='';
                                                                 filename:= Query2.fieldbyname('document').AsString;
                                                                 showmessage('要查看多媒体演示,请单击"多媒体演示"!');
                                                                 count:=count+1;
                                                                 num:=num+1;
                                                        end //end flag 3
                                                        else
                                                            showmessage('数据库中的标识符falg出错')
                                                else
                                                        break;      //break while        except
                showmessage('数据库出错!!');
        end //end 例外处理
end;{$R *.dfm}procedure TForm2.PlayDocumentClick(Sender: TObject);
begin
        ShellExecute(handle,'open',PChar(filename),'-s','',SW_SHOWNORMAL); //执行外部可执行文件(*.exe)
        OK:='0';    //修改可继续执行标记OK
        PlayDocument.Enabled:=false;
end;procedure TForm2.PriZHClick(Sender: TObject);  //上一章
var
        zhang,jie:string;
begin
     try
        table2.Open;
        table2.First;
        jie:=table2.fieldbyname('j_num').AsString ;
        table2.Close;
     except
        showmessage('访问时Table2出错!');
    end;
        zhang:=inttostr(strtoint(DBEdit_zhnum.Text)+1);        if strtoint(zhang)>0 then
        begin
                DBEdit_zhnum.Text:=zhang;
                DBEdit_jnum.Text:=jie;
                OK:='0';                Query1.Close;
                Query1.SQL.Clear;
                Query1.SQL.Add('select zhang_table.zh_name,jie_table.j_name,docu_table.JiLu_num,docu_table.flag,docu_table.document');
                Query1.SQL.Add('from zhang_table,jie_table,docu_table');
                Query1.SQL.Add('where docu_table.zh_num=zhang_table.zh_num and docu_table.j_num=jie_table.j_num');
                Query1.SQL.Add('order by docu_table.j_num');
                Query1.ExecSQL;
                Query2.ExecSQL;                search();
                DBEdit_zhangN.Text:=ZhName ;
                DBEdit_jieN.Text:=JieName;
        end
        else showmessage('目前为第一章');
end;procedure TForm2.PriJieClick(Sender: TObject); //上一节
var
        zhang,jie:string;
begin
   try
       table2.Open;
       table2.Prior  ;
       jie :=table2.fieldbyname('j_num').AsString;
       zhang:=table2.fieldbyname('zh_num').AsString;
       table2.Close;
   except
        showmessage('访问时Table2出错!');
    end;       DBEdit_zhnum.Text:=zhang;
       DBEdit_jnum.Text:=jie;
       if zhang=DBEdit_zhnum.Text then
       begin
                Query1.Close;
                Query1.SQL.Clear;
                Query1.SQL.Add('select zhang_table.zh_name,jie_table.j_name,docu_table.JiLu_num,docu_table.flag,docu_table.document');
                Query1.SQL.Add('from zhang_table,jie_table,docu_table');
                Query1.SQL.Add('where docu_table.zh_num=zhang_table.zh_num and docu_table.j_num=jie_table.j_num');
                Query1.SQL.Add('order by docu_table.j_num');
                Query1.ExecSQL;
                Query2.ExecSQL;                OK:='0';  //修改暂停标志                search();
                DBEdit_zhangN.Text:=ZhName ;
                DBEdit_jieN.Text:=JieName;
       end
       else   showmessage('目前为本章第一节');
end;
//以下还有类似的“下一节”按钮操作
 
procedure TForm2.studyClick(Sender: TObject);  //学习
var
        zh_num,j_num:string;
begin
        OK:='0';
        zh_num:=DBEdit_zhnum.Text;
        j_num:=DBEdit_jnum.Text;        Query1.Close;
        Query1.SQL.Clear;
        Query1.SQL.Add('select zhang_table.zh_name,jie_table.j_name,docu_table.JiLu_num,docu_table.flag,docu_table.document');
        Query1.SQL.Add('from zhang_table,jie_table,docu_table');
        Query1.SQL.Add('where docu_table.zh_num=zhang_table.zh_num and docu_table.j_num=jie_table.j_num');
        Query1.SQL.Add('order by docu_table.j_num');
        Query1.ExecSQL;
        Query2.ExecSQL;        search();
        DBEdit_zhangN.Text:=ZhName ;
        DBEdit_jieN.Text:=JieName;
end;
 
 end.

解决方案 »

  1.   

    SQL语句为:
    select zhang_table.zh_name,jie_table.j_name,docu_table.JiLu_num,docu_table.flag,docu_table.document
    from zhang_table,jie_table,docu_table
    where docu_table.zh_num=zhang_table.zh_num and docu_table.j_num=jie_table.j_num
    and docu_table.zh_num=:zhang and docu_table.j_num=:jie
    order by docu_table.j_num执行部分是:
    Query1.Close;
    Query1.ParamByName('zhang').Value:=DBEdit_zhnum.Text;
    Query1.ParamByName('jie').Value:=DBEdit_jnum.Text;
    Query1.Prepare;
    Query1.ExecSQL;if query1.RecordCount>0 then  //但是执行到这儿时,数据源自动关闭?????????
           ResultSearchShow();
      

  2.   

    Query1.ExecSQL;
    改为
    Query1.Open;
      

  3.   

    如果是select语句的话,最后要用query.open;或query.active:=true;如果是insert、update、delete语句才用execsql;
      

  4.   

    用Query1.open, ExecSQL是针对没有返回值的.Delphi帮助里说得很清楚:
    Note: For SELECT statements, call Open instead of ExecSQL.
      

  5.   

    该成Query1.open后,却出现XXX.exe raised exception class EDBEngineError with message 'Insufficient memory for this operation.
    ......前些天就遇到这种情况,????????
      

  6.   

    你{$R *.dfm}的位置不对呀。应该在implementation的下面一行。
      

  7.   

    哦,刚才试了一下,  {$R *.dfm}的位置好像在哪无所谓。
      

  8.   

    “procedure TForm2.search();//把最终查询结果显示到memeo中”是自己定义的方法,delphi7的一般方法在具体实现时是放在implementation与{$R *.dfm}之间..............................
      

  9.   

    while not Query2.Eof do
                            if  OK='0' then
                                    if Query2.FieldByName('flag').AsString='0' then
                                            begin
                                                    DBMemo1.Lines.Add(Query2.FieldByName('document').AsString);                                                Next;
                                                    num:=num+1;
                                                    count:=count+1;
          ****************continue;***************這處是用來做什麼的?、、
      

  10.   

    我整理了一下不过不太明白楼主要做的目的,所以没有改动程序
    在代码中,加入我的疑问unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Mask, DBCtrls, DBTables, ExtCtrls, StdCtrls, DB;type
      TForm2 = class(TForm)
        Query1: TQuery;
        Query2: TQuery;
        PlayDocument: TButton;
        PriZH: TButton;
        DBMemo1: TDBMemo;
        Image1: TImage;
        Table1: TTable;
        Table2: TTable;
        DBEdit_zhnum: TDBEdit;
        PriJie: TButton;
        study: TButton;
        DBEdit_jnum: TDBEdit;
        DBEdit_zhangN: TDBEdit;
        DBEdit_jieN: TDBEdit;
        procedure PlayDocumentClick(Sender: TObject);
        procedure PriZHClick(Sender: TObject);  //上一章
        procedure PriJieClick(Sender: TObject); //上一节
        procedure studyClick(Sender: TObject);  //学习
      private
        { Private declarations }
      public
        { Public declarations }
        procedure search();
      end;var
      Form2: TForm2;implementation{$R *.dfm}var
      num, count: Integer;
      ZhName,JieName:string;
      OK, filename: string;procedure TForm2.search();//把最终查询结果显示到memeo中
    var
      sFile:string; //图片存取路径和名称
    begin
      num:=0;
      ZhName:='';
      JieName:='';
      try
        ZhName:=Query2.FieldByName('zh_name').AsString;
        JieName:=Query1.FieldByName('j_num').AsString;
        //Query1.First;
        count:= Query2.fieldbyname('JiLu_num').AsInteger;
        Query1.MoveBy(count);
        //在while循环体中,当执行到Flag标识为'1'时,此循环将进入死循环
        //因为Query2没有Next语句
        while not Query2.Eof do
          if OK='0' then
            if Query2.FieldByName('flag').AsString='0' then
            begin
              DBMemo1.Lines.Add(Query2.FieldByName('document').AsString);          Next;
              num:=num+1;
              count:=count+1;
              continue;
            end  //end flag 0
            else if Query1.fieldbyname('flag').AsString='1' then
            begin
              OK:='1'; //修改显示暂停标志为1——暂停
              sFile:=Query2.fieldbyname('document').AsString;//取要加载的图片的路径和名称
              Image1.Picture.LoadFromFile(sFile);   //动态加载.bmp图片
              showmessage('如右图所示');
              num:=num+1;
              count:=count+1;
            end  //end flag 1
            else if Query2.fieldbyname('flag').AsString='3' then
            begin
              OK:='1';  //修改显示暂停标志为1——暂停
              PlayDocument.Enabled:=true;
              filename:='';
              filename:= Query2.fieldbyname('document').AsString;
              showmessage('要查看多媒体演示,请单击"多媒体演示"!');
              count:=count+1;
              num:=num+1;
            end //end flag 3
            else
              showmessage('数据库中的标识符falg出错')
            else
              break;      //break while  except
        showmessage('数据库出错!!');
      end //end 例外处理
    end;
    procedure TForm2.PlayDocumentClick(Sender: TObject);
    begin
      ShellExecute(handle,'open',PChar(filename),'-s',
        '',SW_SHOWNORMAL); //执行外部可执行文件(*.exe)
      OK:='0';    //修改可继续执行标记OK
      PlayDocument.Enabled:=false;
    end;procedure TForm2.PriZHClick(Sender: TObject);  //上一章
    var
      zhang,jie:string;
    begin
      try
        table2.Open;
        table2.First;
        jie:=table2.fieldbyname('j_num').AsString ;
        table2.Close;
      except
        showmessage('访问时Table2出错!');
      end;
      zhang:=inttostr(strtoint(DBEdit_zhnum.Text)+1);  if strtoint(zhang)>0 then
      begin
        DBEdit_zhnum.Text:=zhang;
        DBEdit_jnum.Text:=jie;
        OK:='0';    Query1.Close;
        Query1.SQL.Clear;
        Query1.SQL.Add('select zhang_table.zh_name,' +
                       'jie_table.j_name,docu_table.JiLu_num,' +
                       'docu_table.flag,docu_table.document');
        Query1.SQL.Add('from zhang_table,jie_table,docu_table');
        Query1.SQL.Add('where docu_table.zh_num=zhang_table.zh_num' +
                       ' and docu_table.j_num=jie_table.j_num');
        Query1.SQL.Add('order by docu_table.j_num');
        Query1.Open;
        Query2.Open; //Query2是否已经设置正确?    search();
        DBEdit_zhangN.Text:=ZhName ;
        DBEdit_jieN.Text:=JieName;
      end
      else showmessage('目前为第一章');
    end;procedure TForm2.PriJieClick(Sender: TObject); //上一节
    var
      zhang,jie:string;
    begin
      try
        table2.Open;      //当执行table2.Oepn后,数据集的指针指向First
        table2.Prior  ;   //所以当执行这条语句的时候会出错
        jie :=table2.fieldbyname('j_num').AsString;
        zhang:=table2.fieldbyname('zh_num').AsString;
        table2.Close;
      except
        showmessage('访问时Table2出错!');
      end;  DBEdit_zhnum.Text:=zhang;
      DBEdit_jnum.Text:=jie;
      if zhang=DBEdit_zhnum.Text then
      begin
        Query1.Close;
        Query1.SQL.Clear;
        Query1.SQL.Add('select zhang_table.zh_name,' +
                       'jie_table.j_name,docu_table.JiLu_num,'+
                       'docu_table.flag,docu_table.document');
        Query1.SQL.Add('from zhang_table,jie_table,docu_table');
        Query1.SQL.Add('where docu_table.zh_num=zhang_table.zh_num' +
                       ' and docu_table.j_num=jie_table.j_num');
        Query1.SQL.Add('order by docu_table.j_num');
        Query1.Open;
        Query2.Open;    OK:='0';  //修改暂停标志    search();
        DBEdit_zhangN.Text:=ZhName ;
        DBEdit_jieN.Text:=JieName;
      end
      else   showmessage('目前为本章第一节');
    end;
    //以下还有类似的“下一节”按钮操作procedure TForm2.studyClick(Sender: TObject);  //学习
    var
      zh_num,j_num:string;
    begin
      OK:='0';
      zh_num:=DBEdit_zhnum.Text;
      j_num:=DBEdit_jnum.Text;  Query1.Close;
      Query1.SQL.Clear;
      Query1.SQL.Add('select zhang_table.zh_name,' +
                     'jie_table.j_name,docu_table.JiLu_num,' +
                     'docu_table.flag,docu_table.document');
      Query1.SQL.Add('from zhang_table,jie_table,docu_table');
      Query1.SQL.Add('where docu_table.zh_num=zhang_table.zh_num' +
                     ' and docu_table.j_num=jie_table.j_num');
      Query1.SQL.Add('order by docu_table.j_num');
      Query1.Open;
      Query2.Open;  search();
      DBEdit_zhangN.Text:=ZhName ;
      DBEdit_jieN.Text:=JieName;
    end;
     
    end.
      

  11.   

    to all:
    目的是对三个表进行查询,并显示查询结果:表中的内容有文本、读取图片的路径和读取动化文件的路径,当读到图片时停一下,提示用户有图片,等用户确定后继续往下显示内容,读到有动化文件时也停一下,提示用户...........
    (修改后如下,请各位多提宝贵意见)
    unit form3;
    interface
    uses
    .........
    type
       procedure PlayDocumentClick(Sender: TObject);//播放动化文件
        procedure zhqDSSearch();//查询章号和章名
        procedure jqDSSearch();//查询节号和节名
        procedure DSSearch();//查询上面查到的相应内容
        procedure ResultSearchShow();//显示查询结果
    .......
    implementation
    procedure TForm2.zhqDSSearch();          //查找相应的章
    begin
            try
                    zhq.Close;
                    zhq.ParamByName('zhang').Value:=DBEdit1.Text;
                    zhq.Prepare;
                    zhq.Open;
            except
                    showmessage('查找章名时出错!');
            end;
    end;
    procedure TForm2.jqDSSearch();        //查找相应的节
    begin
            try
                    jq.Close;
                    jq.ParamByName('zhang').Value:=DBEdit1.Text;
                    jq.Prepare;
                    jq.Open;
            except
                    showmessage('查找节名时出错!');
            end;
    end;procedure TForm2.DSSearch();
    begin
            try
                    Query1.Close;
                    Query1.ParamByName('zhang').Value:=DBEdit1.Text;               Query1.ParamByName('jie').Value:=DBEdit2.Text;                Query1.Prepare;
                    Query1.Open;
              except           showmessage('查询有误');          end;end;
    procedure TForm2.ResultSearchShow();//把最终查询结果显示到memeo中
    var
            sFile:string; //图片存取路径和名称
    begin
            num:=0;        try
                  while not Query1.Eof do
                            if  OK='0' then
                                    begin
                                    if Query1.FieldByName('flag').AsString='0' then
                                            begin
                                                    DBMemo1.Lines.Add(Query1.FieldValues['document']);
                                                   //Memo1.Lines.Add(Query1.FieldByName('document').AsString);
                                                    Query1.Next;                                                num:=num+1;
                                                    count:=count+1;
                                                    continue;
                                            end  //end flag 0
                                            else if Query1.FieldByName('flag').AsString='1' then
                                                    begin
                                                            OK:='1'; //修改显示暂停标志为1——暂停
                                                            sFile:=Query1.fieldbyname('document').AsString;//取要加载的图片的路径和名称
                                                            Image1.Picture.LoadFromFile(sFile);   //动态加载.bmp图片
                                                            showmessage('如右图所示');                                                        Query1.Next;
                                                            num:=num+1;
                                                            count:=count+1;
                                                    end  //end flag 1
                                                    else if Query1.fieldbyname('flag').AsString='3' then
                                                            begin
                                                                     OK:='1';  //修改显示暂停标志为1——暂停
                                                                     PlayDocument.Enabled:=true;
                                                                     filename:='';
                                                                     filename:= Query1.fieldbyname('document').AsString;
                                                                     showmessage('要查看多媒体演示,请单击"多媒体演示"!');                                                                Query1.Next;
                                                                    count:=count+1;
                                                                     num:=num+1;
                                                            end //end flag 3
                                                            else                                  showmessage('数据库中的标识符falg出错')
                            end
                            else
                                                            break;      //break while        except
                    showmessage('数据库出错!!');
            end; //end 例外处理
    end;{$R *.dfm}
    ..........(但感觉代码并不是最优,显得罗嗦,原来的使用表关联查询.....)