Solved

eoAsyncExecute on ADO Stored Proc. not updating RecordSetState

Posted on 2001-06-19
3
1,307 Views
Last Modified: 2007-11-27

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
Comment
Question by:ARW
  • 2
3 Comments
 
LVL 7

Accepted Solution

by:
Motaz earned 100 total points
ID: 6209211
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
 

Author Comment

by:ARW
ID: 6212865
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
 

Author Comment

by:ARW
ID: 6216419
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

Free Tool: Postgres Monitoring System

A PHP and Perl based system to collect and display usage statistics from PostgreSQL databases.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…
I've attached the XLSM Excel spreadsheet I used in the video and also text files containing the macros used below. https://filedb.experts-exchange.com/incoming/2017/03_w12/1151775/Permutations.txt https://filedb.experts-exchange.com/incoming/201…

839 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question