我在我的程序中首先触发了Timer的一个事件,然后在其中打开了ADODataSet1,并循环打印其返回的结果。每打印一条记录,就通过ADOCommand执行了一条语句,将该条记录标记为已打印。打印结束后,再触发Timer,以达到循环检索新数据并打印的目的。这时,我发现,即使其它用户增加了新的数据,这段程序在第一次循环结束后,Timer再次触发时,就检测不到新数据了,始终是EOF,不知道是怎么回事?下面的代码有什么不妥当?后台数据库是SQL Server 2000。另外,还有一个问题,当ADODataSet返回EOF时,如何关闭该数据集?我用.Close时,总是触发异常。
procedure TfrmMain.TimerTimer(Sender: TObject);
begin
        Timer.Enabled:=False;
        //showmessage('时间到!');
        try
        ADODataSet1.Open;
        if not (ADODataSet1.Eof and ADODataSet1.Bof) then
        begin
            MainStatusBar.Panels[0].Text:='正在打印......';
            while not ADODataSEt1.Eof do
            begin
                ppReportOrders.PrintToDevices;
                ppReportOrders.Print;
                //执行修改已打印过的记录的代码
                ADOCmd.ConnectionString:=ADODataSet1.ConnectionString;
                ADOCmd.CommandText:='UPDATE tabOrders SET ExtraStatus=''1'' WHERE OrderNo='''+ADODataSet1.FieldByName('OrderNo').AsString+'''';
                ADOCmd.Execute;
                //ADODataSetCmd.Active:=False;
                ADODataSet1.Next;
                MainStatusBar.Panels[0].Text:='当前打印页码:'+IntToStr(ADODataSet1.RecNo);
            end;
            //ADODataSet1.Last;
            ADODataSet1.Refresh;
            ADODataSet1.Close;
            Timer.Enabled:=True;
        end
        else
        begin
            //ADODataSet1.first;
            //ADODataSet1.Refresh;
            ADODataSet1.close;
            Timer.Enabled:=True;        end
        except
          // ADODataSet1.Refresh;
            ADODataSet1.Close;
            Timer.Enabled:=True;
            MainStatusBar.Panels[0].Text:='等待......';
        end;
end;