The Advantage client Engine 10.1 introduced new API calls. One of them, AdsConnect101, can connect to a database using a connection string rather than setting the connection options one by one.
UNSIGNED32 AdsConnect101( UNSIGNED8 *pucConnectString, ADSHANDLE *phConnectOptions, ADSHANDLE *phConnect);
TAdsConnection is able to hook into such a connection, either by setting the ConnectionHandle (TAdsConnection.SetHandle) or by creating a new component based on that ConnectionHandle (TAdsConnection.CreateWithHandle, TAdsConnection.CreateFromHandle).
However, this useful functionality of using a connection string directly is not exposed in TAdsConnection component – you can only retrieve it by calling TAdsConnection.ConnectString function.
So I’ve decided to write my own TAdsConnection descendant:
unit adsconnectionex; interface uses adscnnct, adsdata, ace; type TAdsConnectionEX = class(TAdsConnection) private function GetConnectionString: string; procedure SetConnectionString(const Value: string); published property ConnectionString: string read GetConnectionString write SetConnectionString; end; procedure Register; implementation procedure Register; begin RegisterComponents('Advantage', [TAdsConnectionEX]); end; function TAdsConnectionEX.GetConnectionString: string; begin //use the inherited ConnectString function Result:=ConnectString; end; procedure TAdsConnectionEX.SetConnectionString(const Value: string); var hconn: ADSHANDLE; sconn: ansistring; begin if IsConnected then raise AdsConnectionError.Create( 'The TAdsConnection.ConnectionString '+ 'may not be changed when IsConnected is TRUE'); //implicit conversion of string to AnsiString sconn:=Value; //connect using the ACE API call ACECheck(nil, ace.AdsConnect101(PAnsiChar(sconn),nil,@hconn)); //hook self to the connection handle returned by the ACE API call self.SetHandle(hconn,true); //tell the ancestor component not to keep the connection after Disconnect self.FGivenConnection:=0; end; end.
Connecting a TAdsConnection Component using a connection string