home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 March / Chip_2002-03_cd1.bin / zkuste / delphi / kompon / d5 / ADO.ZIP / src / AdoConnection.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2001-12-23  |  23.5 KB  |  655 lines

  1. unit AdoConnection;
  2.  
  3. interface
  4.  
  5. {$I Ado25.inc}
  6.  
  7. uses
  8.   ActiveX, Classes, Graphics, OleServer, StdVCL,  Windows, Forms, SysUtils,
  9.   Dialogs,
  10.   Ado21Int, AdoConsts;
  11.  
  12. // *********************************************************************//
  13. // The Class CoConnection provides a Create and CreateRemote method to
  14. // create instances of the default interface _Connection exposed by
  15. // the CoClass Connection. The functions are intended to be used by
  16. // clients wishing to automate the CoClass objects exposed by the
  17. // server of this typelibrary.
  18. // *********************************************************************//
  19.  
  20. type
  21.   IConnection = Connection;
  22.   IProperties = Properties;
  23.   IErrors = Errors;
  24.   IError = Error;
  25.   IRecordset = Recordset;
  26.   IFields = Fields;
  27.   IField = Field;
  28.   ICommand = Command;
  29.   IParameters = Parameters;
  30.   IParameter = Parameter;
  31.  
  32.   TConnectionInfoMessage = procedure(Sender: TObject; var pError: OleVariant;
  33.       var adStatus: OleVariant;  var pConnection: OleVariant) of object;
  34.   TConnectionBeginTransComplete = procedure(Sender: TObject; TransactionLevel: Integer;
  35.       var pError: OleVariant; var adStatus: OleVariant; var pConnection: OleVariant) of object;
  36.   TConnectionCommitTransComplete = procedure(Sender: TObject; var pError: OleVariant;
  37.       var adStatus: OleVariant; var pConnection: OleVariant) of object;
  38.   TConnectionRollbackTransComplete = procedure(Sender: TObject; var pError: OleVariant;
  39.       var adStatus: OleVariant; var pConnection: OleVariant) of object;
  40.   TConnectionWillExecute = procedure(Sender: TObject; var Source: OleVariant;
  41.       var CursorType: OleVariant;var LockType: OleVariant; var Options: OleVariant;
  42.       var adStatus: OleVariant; var pCommand: OleVariant; var pRecordset: OleVariant;
  43.       var pConnection: OleVariant) of object;
  44.   TConnectionExecuteComplete = procedure(Sender: TObject; RecordsAffected: Integer;
  45.       var pError: OleVariant; var adStatus: OleVariant; var pCommand: OleVariant;
  46.       var pRecordset: OleVariant; var pConnection: OleVariant) of object;
  47.   TConnectionWillConnect = procedure(Sender: TObject; var ConnectionString: OleVariant;
  48.       var UserID: OleVariant; var Password: OleVariant; var Options: OleVariant;
  49.       var adStatus: OleVariant; var pConnection: OleVariant) of object;
  50.   TConnectionConnectComplete = procedure(Sender: TObject; var pError: OleVariant;
  51.       var adStatus: OleVariant; var pConnection: OleVariant) of object;
  52.   TConnectionDisconnect = procedure(Sender: TObject; var adStatus: OleVariant;
  53.       var pConnection: OleVariant) of object;
  54.  
  55.   TTableType = (ttTable, ttSystemTable, ttView);
  56.   TTableTypes = set of TTableType;
  57.  
  58.  
  59. // *********************************************************************//
  60. // OLE Server Proxy class declaration
  61. // Server Object    : TConnection
  62. // Help String      : 
  63. // Default Interface: _Connection
  64. // Def. Intf. DISP? : No
  65. // Event   Interface: ConnectionEvents
  66. // TypeFlags        : (6) CanCreate Licensed
  67. // *********************************************************************//
  68.   TConnection = class(TOleServer)
  69.   private
  70.     FUserID: WideString;
  71.     FPassword: WideString;
  72.     FConnectOption: ConnectOptionEnum;
  73.     FDefaultDatabase: WideString;
  74.  
  75.     FOnInfoMessage: TConnectionInfoMessage;
  76.     FOnBeginTransComplete: TConnectionBeginTransComplete;
  77.     FOnCommitTransComplete: TConnectionCommitTransComplete;
  78.     FOnRollbackTransComplete: TConnectionRollbackTransComplete;
  79.     FOnWillExecute: TConnectionWillExecute;
  80.     FOnExecuteComplete: TConnectionExecuteComplete;
  81.     FOnWillConnect: TConnectionWillConnect;
  82.     FOnConnectComplete: TConnectionConnectComplete;
  83.     FOnDisconnect: TConnectionDisconnect;
  84.     FIntf:        IConnection;
  85.     function      GetDefaultInterface: IConnection;
  86.     function GetProperites: IProperties;
  87.     function GetActive: boolean;
  88.     procedure SetActive(const Value: boolean);
  89.     function GetPassword: WideString;
  90.     procedure SetPassword(const Value: WideString);
  91.     function GetUserID: WideString;
  92.     procedure SetUserID(const Value: WideString);
  93.     function GetConnectOption: ConnectOptionEnum;
  94.     procedure SetConnectOption(const Value: ConnectOptionEnum);
  95.   protected
  96.     procedure InitServerData; override;
  97.     procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); override;
  98.     function  Get_ConnectionString: WideString;
  99.     procedure Set_ConnectionString(const pbstr: WideString);
  100.     function  Get_CommandTimeout: Integer;
  101.     procedure Set_CommandTimeout(plTimeout: Integer);
  102.     function  Get_ConnectionTimeout: Integer;
  103.     procedure Set_ConnectionTimeout(plTimeout: Integer);
  104.     function  Get_Version: WideString;
  105.     function  Get_Errors: IErrors;
  106.     function  Get_DefaultDatabase: WideString;
  107.     procedure Set_DefaultDatabase(const pbstr: WideString);
  108.     function  Get_IsolationLevel: IsolationLevelEnum;
  109.     procedure Set_IsolationLevel(Level: IsolationLevelEnum);
  110.     function  Get_Attributes: Integer;
  111.     procedure Set_Attributes(plAttr: Integer);
  112.     function  Get_CursorLocation: CursorLocationEnum;
  113.     procedure Set_CursorLocation(plCursorLoc: CursorLocationEnum);
  114.     function  Get_Mode: ConnectModeEnum;
  115.     procedure Set_Mode(plMode: ConnectModeEnum);
  116.     function  Get_Provider: WideString;
  117.     procedure Set_Provider(const pbstr: WideString);
  118.     function  Get_State: Integer;
  119.     procedure WaitForConnectComplete;
  120.   public
  121.     constructor Create(AOwner: TComponent); override;
  122.     destructor  Destroy; override;
  123.     procedure Connect; override;
  124.     procedure ConnectTo(svrIntf: IConnection);
  125.     procedure Disconnect; override;
  126.     procedure Close;
  127.     function  Execute(const CommandText: WideString; out RecordsAffected: OleVariant;
  128.                       Options: Integer): IRecordset;
  129.     function  BeginTrans: Integer;
  130.     procedure CommitTrans;
  131.     procedure RollbackTrans;
  132.     procedure Open(const ConnectionString: WideString; const UserID: WideString;
  133.                    const Password: WideString; Options: Integer); overload;
  134.     procedure Open(const UserID: WideString; const Password: WideString); overload;
  135.     procedure Open; overload;
  136.     function  OpenSchema(Schema: SchemaEnum): IRecordset; overload;
  137.     function  OpenSchema(Schema: SchemaEnum; Restrictions: OleVariant): IRecordset; overload;
  138.     function  OpenSchema(Schema: SchemaEnum; Restrictions: OleVariant; SchemaID: OleVariant): IRecordset; overload;
  139.     procedure Cancel;
  140.     procedure GetProcedureNames(Procs: TStrings);
  141.     procedure GetTableNames(Tables: TStrings; TableTypes: TTableTypes); overload;
  142.     procedure GetTableNames(Tables: TStrings); overload;
  143.     procedure GetFieldNames(TableName: string; Fields: TStrings);
  144.     property  Connection: IConnection read GetDefaultInterface;
  145.     property Errors: IErrors read Get_Errors;
  146.     property Properites: IProperties read GetProperites;
  147.   published
  148.     property Version: WideString read Get_Version;
  149.     property State: integer read Get_State;
  150.     property ConnectionString: WideString read Get_ConnectionString write Set_ConnectionString;
  151.     property CommandTimeout: Integer read Get_CommandTimeout write Set_CommandTimeout;
  152.     property ConnectionTimeout: Integer read Get_ConnectionTimeout write Set_ConnectionTimeout;
  153.     property DefaultDatabase: WideString read Get_DefaultDatabase write Set_DefaultDatabase;
  154.     property IsolationLevel: IsolationLevelEnum read Get_IsolationLevel write Set_IsolationLevel;
  155.     property Attributes: Integer read Get_Attributes write Set_Attributes;
  156.     property CursorLocation: CursorLocationEnum read Get_CursorLocation write Set_CursorLocation;
  157.     property Mode: ConnectModeEnum read Get_Mode write Set_Mode;
  158.     property Provider: WideString read Get_Provider write Set_Provider;
  159.     //new properites
  160.     property UserID: WideString read GetUserID write SetUserID;
  161.     property Password: WideString read GetPassword write SetPassword;
  162.     property ConnectOption: ConnectOptionEnum read GetConnectOption write SetConnectOption; 
  163.     property Active: boolean read GetActive write SetActive;
  164.  
  165.     property OnInfoMessage: TConnectionInfoMessage read FOnInfoMessage write FOnInfoMessage;
  166.     property OnBeginTransComplete: TConnectionBeginTransComplete read FOnBeginTransComplete write FOnBeginTransComplete;
  167.     property OnCommitTransComplete: TConnectionCommitTransComplete read FOnCommitTransComplete write FOnCommitTransComplete;
  168.     property OnRollbackTransComplete: TConnectionRollbackTransComplete read FOnRollbackTransComplete write FOnRollbackTransComplete;
  169.     property OnWillExecute: TConnectionWillExecute read FOnWillExecute write FOnWillExecute;
  170.     property OnExecuteComplete: TConnectionExecuteComplete read FOnExecuteComplete write FOnExecuteComplete;
  171.     property OnWillConnect: TConnectionWillConnect read FOnWillConnect write FOnWillConnect;
  172.     property OnConnectComplete: TConnectionConnectComplete read FOnConnectComplete write FOnConnectComplete;
  173.     property OnDisconnect: TConnectionDisconnect read FOnDisconnect write FOnDisconnect;
  174.   end;
  175.  
  176.   EAdoError =Exception;
  177.  
  178.  
  179. procedure DoAdoError(ErrMsg: string); overload;
  180. procedure DoAdoError(Errors: IErrors); overload;
  181. procedure DoAdoError(const Msg: string; const Args: array of const); overload;
  182.  
  183. implementation
  184.  
  185. uses ComObj;
  186.  
  187. const
  188.   ConnStr = 'Provider=%s;Data Source=%s;User ID=%s;Password=%s;%s';
  189.  
  190.  
  191. procedure DoAdoError(ErrMsg: string);
  192. begin
  193.   raise EAdoError.Create(ErrMsg);
  194. end;
  195.  
  196. procedure DoAdoError(const Msg: string; const Args: array of const);
  197. begin
  198.   raise EAdoError.CreateFmt(Msg, Args);
  199. end;
  200.  
  201. procedure DoAdoError(Errors: IErrors);
  202. var ErrMsg: string;
  203.     i: integer;
  204. begin
  205.   case Errors.Count of
  206.     0: exit;
  207.     1: ErrMsg:= 'Wyst╣pi│ b│╣d AD0:'#10+Format('%s.%s', [Errors[0].Source, Errors[0].Description]);
  208.     else begin
  209.       ErrMsg:= 'Wyst╣pi│y b│Ωdy AD0:'#10;
  210.       for i:= 0 to Errors.Count-1 do
  211.         ErrMsg:= ErrMsg+Format('%d: %s.%s'#10, [i+1, Errors[i].Source, Errors[i].Description]);
  212.     end;
  213.   end;
  214.   DoAdoError(ErrMsg);
  215. end;
  216.  
  217. procedure TConnection.InitServerData;
  218. const
  219.   CServerData: TServerData = (
  220.     ClassID:   '{00000514-0000-0010-8000-00AA006D2EA4}';
  221.     IntfIID:   '{00000550-0000-0010-8000-00AA006D2EA4}';
  222.     EventIID:  '{00000400-0000-0010-8000-00AA006D2EA4}';
  223.     LicenseKey: nil;
  224.     Version: 500);
  225. begin
  226.   ServerData := @CServerData;
  227. end;
  228.  
  229. procedure TConnection.Connect;
  230. var
  231.   punk: IUnknown;
  232. begin
  233.   if FIntf = nil then
  234.   begin
  235.     punk := GetServer;
  236.     ConnectEvents(punk);
  237.     Fintf:= punk as IConnection;
  238.   end;
  239. end;
  240.  
  241. procedure TConnection.ConnectTo(svrIntf: IConnection);
  242. begin
  243.   Disconnect;
  244.   FIntf := svrIntf;
  245.   ConnectEvents(FIntf);
  246. end;
  247.  
  248. procedure TConnection.DisConnect;
  249. begin
  250.   if Fintf <> nil then
  251.   begin
  252.     DisconnectEvents(FIntf);
  253.     FIntf := nil;
  254.   end;
  255. end;
  256.  
  257. function TConnection.GetDefaultInterface: IConnection;
  258. begin
  259.   if FIntf = nil then
  260.     Connect;
  261.   Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation');
  262.   Result := FIntf;
  263. end;
  264.  
  265. constructor TConnection.Create(AOwner: TComponent);
  266. begin
  267.   inherited Create(AOwner);
  268.   AutoConnect:= true;
  269. end;
  270.  
  271. destructor TConnection.Destroy;
  272. begin
  273.   inherited Destroy;
  274. end;
  275.  
  276. procedure TConnection.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
  277. begin
  278.   case DispID of
  279.     -1: Exit;  // DISPID_UNKNOWN
  280.    0: if Assigned(FOnInfoMessage) then
  281.             FOnInfoMessage(Self, Params[0] {const Error}, Params[1] {var EventStatusEnum}, Params[2] {const _Connection});
  282.    1: if Assigned(FOnBeginTransComplete) then
  283.             FOnBeginTransComplete(Self, Params[0] {Integer}, Params[1] {const Error}, Params[2] {var EventStatusEnum}, Params[3] {const _Connection});
  284.    3: if Assigned(FOnCommitTransComplete) then
  285.             FOnCommitTransComplete(Self, Params[0] {const Error}, Params[1] {var EventStatusEnum}, Params[2] {const _Connection});
  286.    2: if Assigned(FOnRollbackTransComplete) then
  287.             FOnRollbackTransComplete(Self, Params[0] {const Error}, Params[1] {var EventStatusEnum}, Params[2] {const _Connection});
  288.    4: if Assigned(FOnWillExecute) then
  289.             FOnWillExecute(Self, Params[0] {var WideString}, Params[1] {var CursorTypeEnum}, Params[2] {var LockTypeEnum}, Params[3] {var Integer}, Params[4] {var EventStatusEnum}, Params[5] {const _Command}, Params[6] {const _Recordset}, Params[7] {const _Connection});
  290.    5: if Assigned(FOnExecuteComplete) then
  291.             FOnExecuteComplete(Self, Params[0] {Integer}, Params[1] {const Error}, Params[2] {var EventStatusEnum}, Params[3] {const _Command}, Params[4] {const _Recordset}, Params[5] {const _Connection});
  292.    6: if Assigned(FOnWillConnect) then
  293.             FOnWillConnect(Self, Params[0] {var WideString}, Params[1] {var WideString}, Params[2] {var WideString}, Params[3] {var Integer}, Params[4] {var EventStatusEnum}, Params[5] {const _Connection});
  294.    7: if Assigned(FOnConnectComplete) then
  295.             FOnConnectComplete(Self, Params[0] {const Error}, Params[1] {var EventStatusEnum}, Params[2] {const _Connection});
  296.    8: if Assigned(FOnDisconnect) then
  297.             FOnDisconnect(Self, Params[0] {var EventStatusEnum}, Params[1] {const _Connection});
  298.   end; {case DispID}
  299. end;
  300.  
  301. function  TConnection.Get_ConnectionString: WideString;
  302. begin
  303.   Result := Connection.Get_ConnectionString;
  304. end;
  305.  
  306. procedure TConnection.Set_ConnectionString(const pbstr: WideString);
  307. begin
  308.   if pbstr <> ConnectionString then begin
  309.     Close;
  310.     Connection.Set_ConnectionString(pbstr);
  311.   end;
  312. end;
  313.  
  314. function  TConnection.Get_CommandTimeout: Integer;
  315. begin
  316.   Result := Connection.Get_CommandTimeout;
  317. end;
  318.  
  319. procedure TConnection.Set_CommandTimeout(plTimeout: Integer);
  320. begin
  321.   Connection.Set_CommandTimeout(plTimeout);
  322. end;
  323.  
  324. function  TConnection.Get_ConnectionTimeout: Integer;
  325. begin
  326.   Result := Connection.Get_ConnectionTimeout;
  327. end;
  328.  
  329. procedure TConnection.Set_ConnectionTimeout(plTimeout: Integer);
  330. begin                
  331.   if ConnectionTimeout <> plTimeout then
  332.   begin
  333.     Close;
  334.     Connection.Set_ConnectionTimeout(plTimeout);
  335.   end;
  336. end;
  337.  
  338. function  TConnection.Get_Version: WideString;
  339. begin
  340.   Result := Connection.Get_Version;
  341. end;
  342.  
  343. function  TConnection.Get_Errors: IErrors;
  344. begin
  345.   Result := Connection.Get_Errors as IErrors;
  346. end;
  347.  
  348. function  TConnection.Get_DefaultDatabase: WideString;
  349. begin        
  350.   if Active then
  351.   try
  352.     Result := Connection.Get_DefaultDatabase;
  353.   except
  354.   end
  355.   else
  356.     Result := FDefaultDatabase;
  357. end;
  358.  
  359. procedure TConnection.Set_DefaultDatabase(const pbstr: WideString);
  360. begin                  
  361.   if DefaultDatabase <> pbstr then
  362.   begin
  363.     FDefaultDatabase := pbstr;
  364.     if Active then
  365.       Connection.Set_DefaultDatabase(pbstr);
  366.   end; 
  367. end;
  368.  
  369. function  TConnection.Get_IsolationLevel: IsolationLevelEnum;
  370. begin
  371.   Result := Connection.Get_IsolationLevel;
  372. end;
  373.  
  374. procedure TConnection.Set_IsolationLevel(Level: IsolationLevelEnum);
  375. begin
  376.   if IsolationLevel <> Level then begin
  377.     //Close;
  378.     Connection.Set_IsolationLevel(Level);
  379.   end;
  380. end;
  381.  
  382. function  TConnection.Get_Attributes: Integer;
  383. begin
  384.   Result := Connection.Get_Attributes;
  385. end;
  386.  
  387. procedure TConnection.Set_Attributes(plAttr: Integer);
  388. begin
  389.   if Attributes <> plAttr then begin
  390.     //Close;
  391.     Connection.Set_Attributes(plAttr);
  392.   end;
  393. end;
  394.  
  395. function  TConnection.Get_CursorLocation: CursorLocationEnum;
  396. begin
  397.   Result := Connection.Get_CursorLocation;
  398. end;
  399.  
  400. procedure TConnection.Set_CursorLocation(plCursorLoc: CursorLocationEnum);
  401. begin
  402.   if CursorLocation <> plCursorLoc then begin
  403.     //Close;
  404.     Connection.Set_CursorLocation(plCursorLoc);
  405.   end;
  406. end;
  407.  
  408. function  TConnection.Get_Mode: ConnectModeEnum;
  409. begin
  410.   Result := Connection.Mode;
  411. end;
  412.  
  413. procedure TConnection.Set_Mode(plMode: ConnectModeEnum);
  414. begin
  415.   if Mode <> plMode then begin
  416.     Close;
  417.     Connection.Mode:= plMode;
  418.   end;
  419. end;
  420.  
  421. function  TConnection.Get_Provider: WideString;
  422. begin
  423.   Result := Connection.Get_Provider;
  424. end;
  425.  
  426. procedure TConnection.Set_Provider(const pbstr: WideString);
  427. begin             
  428.   if Provider <> pbstr then
  429.   begin
  430.     Close;
  431.     Connection.Set_Provider(pbstr);
  432.     //InternalUpdateConnectionString;
  433.   end;
  434. end;
  435. //------------------------------------------------------------------------------
  436. function  TConnection.Get_State: Integer;
  437. begin
  438.   Result := Connection.Get_State;
  439. end;
  440. //------------------------------------------------------------------------------
  441. function  TConnection.BeginTrans: Integer;
  442. begin
  443.   Result := Connection.BeginTrans;
  444. end;
  445. //------------------------------------------------------------------------------
  446. procedure TConnection.CommitTrans;
  447. begin
  448.   Connection.CommitTrans;
  449. end;
  450. //------------------------------------------------------------------------------
  451. procedure TConnection.RollbackTrans;
  452. begin
  453.   Connection.RollbackTrans;
  454. end;
  455. //------------------------------------------------------------------------------
  456. procedure TConnection.Close;
  457. begin
  458.   if Active then
  459.     if Assigned(Connection) then
  460.     begin
  461.       //while InTransaction do RollbackTrans;
  462.       Connection.Close;
  463.     end;
  464. end;
  465. //------------------------------------------------------------------------------
  466. procedure TConnection.Open;
  467. begin
  468.   if not Active then begin
  469.     if ConnectionString = '' then
  470.       DoAdoError(emNoConnectionString);
  471.     Open(ConnectionString, UserID, Password, ConnectOption);
  472.   end;
  473. end;
  474. //------------------------------------------------------------------------------
  475. procedure TConnection.Open(const UserID, Password: WideString);
  476. begin
  477.   Open(ConnectionString, UserID, Password, ConnectOption);
  478. end;
  479. //------------------------------------------------------------------------------
  480. procedure TConnection.Open(const ConnectionString: WideString; const UserID: WideString;
  481.                            const Password: WideString; Options: Integer);
  482. begin
  483.   Close;
  484.   Connection.Open(ConnectionString, UserID, Password, Options);
  485.   if DefaultDatabase <> '' then
  486.     Connection.DefaultDatabase := FDefaultDatabase;
  487.   FUserID:= UserID;
  488.   FPassword:= FPassword;
  489.   FConnectOption:= Options;
  490.   Connection.DefaultDatabase:= FDefaultDatabase;
  491.   WaitForConnectComplete;
  492. end;
  493. //------------------------------------------------------------------------------
  494. function  TConnection.OpenSchema(Schema: SchemaEnum): IRecordset;
  495. begin
  496.   Result := OpenSchema(Schema, EmptyParam, EmptyParam);
  497. end;
  498. //------------------------------------------------------------------------------
  499. function  TConnection.OpenSchema(Schema: SchemaEnum; Restrictions: OleVariant): IRecordset;
  500. begin
  501.   Result := OpenSchema(Schema, Restrictions, EmptyParam);
  502. end;
  503. //------------------------------------------------------------------------------
  504. function  TConnection.OpenSchema(Schema: SchemaEnum; Restrictions: OleVariant; SchemaID: OleVariant): IRecordset;
  505. begin
  506.   Result := Connection.OpenSchema(Schema, Restrictions, SchemaID) as IRecordset;
  507. end;
  508. //------------------------------------------------------------------------------
  509. function  TConnection.Execute(const CommandText: WideString; out RecordsAffected: OleVariant;
  510.                               Options: Integer): IRecordset;
  511. begin
  512.   Result := Connection.Execute(CommandText, RecordsAffected, Options) as IRecordset;
  513. end;
  514. //------------------------------------------------------------------------------
  515. procedure TConnection.Cancel;
  516. begin
  517.   Connection.Cancel;
  518. end;
  519. //------------------------------------------------------------------------------
  520. function TConnection.GetProperites: IProperties;
  521. begin
  522.   result:= Connection.Properties as IProperties;
  523. end;
  524. //------------------------------------------------------------------------------
  525. procedure TConnection.SetActive(const Value: boolean);
  526. begin
  527.   if Value then Open
  528.   else Close;
  529. end;
  530. //------------------------------------------------------------------------------
  531. function TConnection.GetActive: boolean;
  532. begin
  533.   WaitForConnectComplete;
  534.   Result := Assigned(Connection)
  535.     and ((adStateOpen and Connection.State) <> 0);
  536. end;
  537. //------------------------------------------------------------------------------
  538. procedure TConnection.WaitForConnectComplete;
  539. begin
  540.   if Assigned(Connection) then
  541.     while (Connection.State = adStateConnecting) do
  542.       Application.ProcessMessages;
  543. end;
  544. //------------------------------------------------------------------------------
  545. function TConnection.GetConnectOption: ConnectOptionEnum;
  546. begin
  547.   result:= FConnectOption;
  548. end;
  549. //------------------------------------------------------------------------------
  550. procedure TConnection.SetConnectOption(const Value: ConnectOptionEnum);
  551. begin
  552.   if Value<>FConnectOption then begin
  553.     Close;
  554.     FConnectOption:= Value;
  555.   end;
  556. end;
  557. //------------------------------------------------------------------------------
  558. function TConnection.GetPassword: WideString;
  559. begin
  560.   result:= FPassword;
  561. end;
  562. //------------------------------------------------------------------------------
  563. procedure TConnection.SetPassword(const Value: WideString);
  564. begin
  565.   if Value <> FPassword then begin
  566.     Close;
  567.     FPassword:= Value;
  568.   end;
  569. end;
  570. //------------------------------------------------------------------------------
  571. function TConnection.GetUserID: WideString;
  572. begin
  573.   result:= FUserID;
  574. end;
  575. //------------------------------------------------------------------------------
  576. procedure TConnection.SetUserID(const Value: WideString);
  577. begin
  578.   if Value<>FUserID then begin
  579.     Close;
  580.     FUserID:= Value;
  581.   end;
  582. end;
  583. //------------------------------------------------------------------------------
  584. procedure TConnection.GetProcedureNames(Procs: TStrings);
  585. var ProcField: IField;
  586.     Rst: IRecordset;
  587. begin
  588.   if not Active then
  589.     DoAdoError(emNoConnectionActive);
  590.   Procs.Clear;
  591.   Rst:= OpenSchema(adSchemaProcedures);
  592.   try
  593.     ProcField:= Rst.Fields['PROCEDURE_NAME'] as IField;
  594.     Rst.MoveFirst;
  595.     while not Rst.EOF do begin
  596.       Procs.Add(ProcField.Value);
  597.       Rst.MoveNext;
  598.     end;
  599.   finally
  600.     Rst:= nil;
  601.   end;
  602. end;  
  603. //------------------------------------------------------------------------------
  604. procedure TConnection.GetTableNames(Tables: TStrings; TableTypes: TTableTypes);
  605. var TypeField, NameField: IField;
  606.     TypeName: string;
  607.     Rst: IRecordset;
  608. begin
  609.   if not Active then
  610.     DoAdoError(emNoConnectionActive);
  611.   Tables.Clear;
  612.   Rst:= OpenSchema(adSchemaTables);
  613.   try
  614.     TypeField := Rst.Fields['TABLE_TYPE'] as IField;
  615.     NameField := Rst.Fields['TABLE_NAME'] as IField;
  616.     Tables.Clear;
  617.     Rst.MoveFirst;
  618.     while not Rst.EOF do begin
  619.       TypeName := TypeField.Value;
  620.       if ( (TypeName = 'TABLE') and (ttTable in TableTypes) )
  621.          or ( (TypeName = 'SYSTEM TABLE') and (ttSystemTable in TableTypes))
  622.          or ( (TypeName = 'VIEW') and (ttView in TableTypes) )  then
  623.         Tables.Add(NameField.Value);
  624.       Rst.MoveNext;
  625.     end;
  626.   finally
  627.     Rst:= nil;
  628.   end;
  629. end;
  630. //------------------------------------------------------------------------------
  631. procedure TConnection.GetTableNames(Tables: TStrings);
  632. begin
  633.   GetTableNames(Tables, [ttTable, ttView]);
  634. end;
  635. //------------------------------------------------------------------------------
  636. procedure TConnection.GetFieldNames(TableName: string; Fields: TStrings);
  637. var Rst: IRecordset;
  638. begin      
  639.   if not Active then
  640.     DoAdoError(emNoConnectionActive);
  641.   Fields.Clear;
  642.   Rst := OpenSchema(adSchemaColumns, VarArrayOf([Null, Null, TableName]));
  643.   try
  644.     Fields.Clear;
  645.     while not Rst.EOF do begin
  646.       Fields.Add(Rst.Fields['COLUMN_NAME'].Value);
  647.       Rst.MoveNext;
  648.     end;
  649.   finally
  650.     Rst:= nil;
  651.   end;
  652. end;
  653.  
  654. end.
  655.