Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1388
  • Last Modified:

eoAsyncExecute on ADO Stored Proc. not updating RecordSetState


When running a query asynchronously, using ExecuteOptions eoAsyncExecute, I thought I could check the state of the component, to see whether it is done or not, by checking RecordSetState.  Unfortunately, it is always an EmptySet.  I have the latest ADO patch for Delphi 5 and I am running against a SQL 7.0 database.  Is there a bug here or am I doing something wrong?

Thank you,

ARW
0
ARW
Asked:
ARW
  • 2
1 Solution
 
MotazCommented:
I turn AsyncExecute and AsyncFetch options to True and it works:

  AdoStoredProc1.Open;
  Memo1.Clear;


this is on a timer event:


  Caption:= IntToStr(Byte(AdoStoredProc1.State));
  if Byte(AdoStoredProc1.state) = 1 then
  begin
  with AdoStoredProc1 do
  while not Eof do
  begin
    Memo1.Lines.Add(Fields[0].AsString);
    Next;
  end;
  AdoStoredProc1.Close;
  end;
0
 
ARWAuthor Commented:
Interesting implementation.

Thanks for pointing out to me that I had to set two properties of the execute options, not just one.  it still did not work though.  I had to change to client side cursor and ctKeyset cursor type.  Still did not work.  Finally, I noticed that your code snippet used an open.  My stored proc returns no records.  It calls a bunch others that update a temp table, so I used ExecProc method instead of Open.

You have to do an Open to get it to work.  Here is what mine looks like.

procedure TdmData.GetClientData;
var
work : tobjectstates;
begin
with spGetClientItems do
  begin
  Close;
  CommandTimeout := 3000;
//     spGetClientItems.ExecuteOptions := [eoAsyncfetch];
  Parameters.ParamValues['@CustID'] := CurrentClient;
  Parameters.ParamValues['@Modality'] := CurrentModality;
  Parameters.ParamValues['@StartDate'] := StartDate;
  Parameters.ParamValues['@EndDate'] := EndDate;
  Parameters.ParamValues['@SourceDB'] := SourceDB;
work := Tcustomadodataset(spGetClientItems).recordsetstate;
   open;  // was execproc
   while ( (RecordsetState = [stConnecting] ) OR
              (RecordsetState = [stExecuting] ) OR
             (RecordsetState = [stFetching]) ) do
      begin  // if get in here it is working
      Sleep(200);
      Application.ProcessMessages;
      end;    // while
   Close;
  End;
end;



Thanks for your help,

ARW
   
0
 
ARWAuthor Commented:
I seem to have the asynchronous behavior I am looking for, except when the query gets done, it closes itself without an explicit close by me.  Then I have to reopen it, which defeats the purpose.

Any ideas?
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now