Maybe when you’ve used the SQL Server Management studio ‘ve noticed that you can run multiple queries at once.
ADO supports this feature, and you can include it in your applications. the key is to use the function NextRecordset and then assign it to any TCustomADODataSet descendent.
see this simple example.
program MultiDataSetsADO; {$APPTYPE CONSOLE} uses ActiveX, ADODB, SysUtils; const //the connection string StrConnection='Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Application Name=MyApp;' + 'Data Source=%s;Use method for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False'; var AdoConnection : TADOConnection; procedure SetupConnection;//Open a connection begin Writeln('Connecting to SQL Server'); AdoConnection:=TADOConnection.Create(nil); AdoConnection.LoginPrompt:=False;//dont ask for the login parameters AdoConnection.ConnectionString:=Format(StrConnection,['pass','user','DataBase','Server']); AdoConnection.Connected:=True; //open the connection Writeln('Connected'); end; procedure CloseConnection;//Close an open connection begin Writeln('Closing connection to Sql Server'); if AdoConnection.Connected then AdoConnection.Close; AdoConnection.Free; Writeln('Connection closed'); end; Procedure RunMutilplesQuerysatOnce(SqlQuerys : array of string); var AdoDataSet : TADODataSet; AdoDataSetChild : TADODataSet; i : integer; j : integer; RecCount : OleVariant; begin AdoDataSet:=TADODataSet.Create(nil); try AdoDataSet.Connection :=AdoConnection;//set the connection AdoDataSet.CommandType:=cmdText; AdoDataSet.LockType :=ltReadOnly; for i:=Low(SqlQuerys) to High(SqlQuerys) do AdoDataSet.CommandText:=AdoDataSet.CommandText+SqlQuerys[i]+' '; //assign the querys AdoDataSet.Open;//Execute all the querys at once. for i:=Low(SqlQuerys) to High(SqlQuerys) do begin AdoDataSetChild:=TADODataSet.Create(nil);//Create a Dummy dataset to fetch the data try Writeln('Loading Dataset #'+IntToStr(i+1)); if i=0 then AdoDataSetChild.Recordset:=AdoDataSet.Recordset //Assign the first dataset returned else AdoDataSetChild.Recordset:=AdoDataSet.Recordset.NextRecordset(RecCount); //Assign the next dataset in the buffer for j:=0 to AdoDataSetChild.FieldCount-1 do Write(format('%-15s',[AdoDataSetChild.Fields[j].FieldName])); //Show the fields names Writeln; while not AdoDataSetChild.eof do begin //do your stuff here for j:=0 to AdoDataSetChild.FieldCount-1 do Write(format('%-15s',[AdoDataSetChild.Fields[j].asString])); // Show the data Writeln; AdoDataSetChild.Next; end; finally AdoDataSetChild.Free; end; end; finally AdoDataSet.Free; end; end; begin CoInitialize(nil); // call CoInitialize() try Writeln('Init'); try SetupConnection; RunMutilplesQuerysatOnce( [ 'select top 10 transnum,transtype,ItemCode from oinm', 'select top 10 CardCode,CardType,Country from ocrd', 'select top 10 ItemCode,ItemType,ManBtchNum,OnHand,OnOrder from oitm'] ); CloseConnection; //close the connection except on E : Exception do Writeln(E.Classname, ': ', E.Message); end; Readln; finally CoUnInitialize; // free memory end; end.
if you run the Sql Profiler you can check wich all the querys are executed at once
and the final result is
program MultiDataSetsADO;
{$APPTYPE CONSOLE}
uses
ActiveX,
ADODB,
SysUtils;
const
//the connection string
StrConnection=’Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Application Name=MyApp;’ +
‘Data Source=%s;Use method for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False’;
var
AdoConnection : TADOConnection;
procedure SetupConnection;//Open a connection
begin
Writeln(‘Connecting to SQL Server’);
AdoConnection:=TADOConnection.Create(nil);
AdoConnection.LoginPrompt:=False;//dont ask for the login parameters
AdoConnection.ConnectionString:=Format(StrConnection,[‘us8j329′,’sa’,’CMMSDEMO_ORICA’,’localhost’]);
AdoConnection.Connected:=True; //open the connection
Writeln(‘Connected’);
end;
procedure CloseConnection;//Close an open connection
begin
Writeln(‘Closing connection to Sql Server’);
if AdoConnection.Connected then
AdoConnection.Close;
AdoConnection.Free;
Writeln(‘Connection closed’);
end;
Procedure RunMutilplesQuerysatOnce(SqlQuerys : array of string);
var
AdoDataSet : TADODataSet;
AdoDataSetChild : TADODataSet;
i : integer;
j : integer;
RecCount : OleVariant;
begin
AdoDataSet:=TADODataSet.Create(nil);
try
AdoDataSet.Connection :=AdoConnection;
AdoDataSet.CommandType:=cmdText;
AdoDataSet.LockType :=ltReadOnly;
for i:=Low(SqlQuerys) to High(SqlQuerys) do
AdoDataSet.CommandText:=AdoDataSet.CommandText+SqlQuerys[i]+’ ‘;
AdoDataSet.Open;
for i:=Low(SqlQuerys) to High(SqlQuerys) do
begin
AdoDataSetChild:=TADODataSet.Create(nil);
try
Writeln(‘Loading Dataset #’+IntToStr(i+1));
if i=0 then
AdoDataSetChild.Recordset:=AdoDataSet.Recordset
else
AdoDataSetChild.Recordset:=AdoDataSet.Recordset.NextRecordset(RecCount);
for j:=0 to AdoDataSetChild.FieldCount-1 do
Write(format(‘%-15s’,[AdoDataSetChild.Fields[j].FieldName]));
Writeln;
while not AdoDataSetChild.eof do
begin
for j:=0 to AdoDataSetChild.FieldCount-1 do
Write(format(‘%-15s’,[AdoDataSetChild.Fields[j].asString]));
Writeln;
AdoDataSetChild.Next;
end;
finally
AdoDataSetChild.Free;
end;
end;
finally
AdoDataSet.Free;
end;
end;
begin
CoInitialize(nil); // call CoInitialize()
try
Writeln(‘Init’);
try
SetupConnection;
RunMutilplesQuerysatOnce(
[
‘select top 10 transnum,transtype,ItemCode from oinm’,
‘select top 10 CardCode,CardType,Country from ocrd’,
‘select top 10 ItemCode,ItemType,ManBtchNum,OnHand,OnOrder from oitm’]
);
CloseConnection; //close the connection
except
on E : Exception do
Writeln(E.Classname, ‘: ‘, E.Message);
end;
Readln;
finally
CoUnInitialize; // free memory
end;
end.