Dbqbe.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:18k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1995, 1996 AO ROSNO             }
  6. {         Copyright (c) 1997, 1998 Master-Bank          }
  7. {                                                       }
  8. {*******************************************************}
  9. unit DBQBE;
  10. {*************************************************************************}
  11. { The Delphi TQBEQuery component.                                         }
  12. { This component derives from TDBDataSet and is much like TQuery except   }
  13. { the language used for Query is QBE (Query by example).                  }
  14. { You can create the QBE queries from Paradox or DatabaseDesktop and then }
  15. { load or paste the query strings in the QBE property of TQBEQuery.       }
  16. {*************************************************************************}
  17. {$I RX.INC}
  18. {$N+,P+,S-}
  19. interface
  20. uses SysUtils, {$IFDEF WIN32} Windows, Bde, {$ELSE} WinTypes, WinProcs,
  21.   DbiErrs, DbiTypes, DbiProcs, {$ENDIF} Classes, Controls, DB, DBTables;
  22. const
  23.   DefQBEStartParam = '#';
  24. type
  25.   TCheckType = (ctNone, ctCheck, ctCheckPlus, ctCheckDesc, ctCheckGroup);
  26. { TQBEQuery }
  27.   TQBEQuery = class(TDBDataSet)
  28.   private
  29.     FStmtHandle: HDBIStmt;
  30.     FQBE: TStrings;
  31.     FPrepared: Boolean;
  32.     FParams: TParams;
  33.     FStartParam: Char;
  34.     FAuxiliaryTables: Boolean;
  35. {$IFDEF WIN32}
  36.     FText: string;
  37.     FRowsAffected: Integer;
  38. {$ELSE}
  39.     FText: PChar;
  40. {$ENDIF}
  41. {$IFDEF RX_D3}
  42.     FConstrained: Boolean;
  43. {$ENDIF}
  44.     FLocal: Boolean;
  45.     FRequestLive: Boolean;
  46.     FBlankAsZero: Boolean;
  47.     FParamCheck: Boolean;
  48.     function CreateCursor(GenHandle: Boolean): HDBICur;
  49.     procedure ReplaceParams(QBEText: TStrings);
  50.     procedure CreateParams(List: TParams; const Value: PChar);
  51.     procedure FreeStatement;
  52.     function GetQueryCursor(GenHandle: Boolean): HDBICur;
  53.     procedure GetStatementHandle(QBEText: PChar);
  54.     procedure PrepareQBE(Value: PChar);
  55.     procedure QueryChanged(Sender: TObject);
  56.     procedure SetQuery(Value: TStrings);
  57.     procedure SetParamsList(Value: TParams);
  58.     procedure SetPrepared(Value: Boolean);
  59.     procedure SetPrepare(Value: Boolean);
  60.     procedure SetStartParam(Value: Char);
  61. {$IFDEF RX_D4}
  62.     procedure ReadParamData(Reader: TReader);
  63.     procedure WriteParamData(Writer: TWriter);
  64. {$ENDIF}
  65. {$IFDEF WIN32}
  66.     function GetRowsAffected: Integer;
  67. {$ENDIF}
  68. {$IFDEF RX_D5}
  69.   protected
  70.     { IProviderSupport }
  71.     procedure PSExecute; override;
  72.     function PSGetParams: TParams; override;
  73.     procedure PSSetCommandText(const CommandText: string); override;
  74.     procedure PSSetParams(AParams: TParams); override;
  75. {$ENDIF}
  76.   protected
  77.     function CreateHandle: HDBICur; override;
  78.     procedure Disconnect; override;
  79.     function GetParamsCount: Word;
  80. {$IFDEF RX_D4}
  81.     procedure DefineProperties(Filer: TFiler); override;
  82. {$ENDIF}
  83. {$IFDEF RX_V110}
  84.     function SetDBFlag(Flag: Integer; Value: Boolean): Boolean; override;
  85. {$ELSE}
  86.     procedure SetDBFlag(Flag: Integer; Value: Boolean); override;
  87. {$ENDIF}
  88.   public
  89.     constructor Create(AOwner: TComponent); override;
  90.     destructor Destroy; override;
  91.     function GetQBEText: PChar;
  92.     procedure ExecQBE;
  93.     function ParamByName(const Value: string): TParam;
  94.     procedure Prepare;
  95.     procedure RefreshQuery;
  96.     procedure UnPrepare;
  97. {$IFNDEF RX_D3}
  98.     function IsEmpty: Boolean;
  99. {$ENDIF}
  100.     property Local: Boolean read FLocal;
  101.     property ParamCount: Word read GetParamsCount;
  102.     property Prepared: Boolean read FPrepared write SetPrepare;
  103.     property StmtHandle: HDBIStmt read FStmtHandle;
  104. {$IFDEF WIN32}
  105.     property Text: string read FText;
  106.     property RowsAffected: Integer read GetRowsAffected;
  107. {$ELSE}
  108.     property Text: PChar read FText;
  109. {$ENDIF}
  110.   published
  111. {$IFDEF RX_D5}
  112.     property AutoRefresh;
  113. {$ENDIF}
  114.     property AuxiliaryTables: Boolean read FAuxiliaryTables write FAuxiliaryTables default True;
  115.     property ParamCheck: Boolean read FParamCheck write FParamCheck default True;
  116.     property StartParam: Char read FStartParam write SetStartParam default DefQBEStartParam;
  117.     { Ensure StartParam is declared before QBE }
  118.     property QBE: TStrings read FQBE write SetQuery;
  119.     { Ensure QBE is declared before Params }
  120.     property BlankAsZero: Boolean read FBlankAsZero write FBlankAsZero default False;
  121.     property Params: TParams read FParams write SetParamsList {$IFDEF RX_D4} stored False {$ENDIF};
  122.     property RequestLive: Boolean read FRequestLive write FRequestLive default False;
  123.     property UpdateMode;
  124. {$IFDEF WIN32}
  125.     property UpdateObject;
  126.   {$IFDEF RX_D3}
  127.     property Constrained: Boolean read FConstrained write FConstrained default False;
  128.     property Constraints stored ConstraintsStored;
  129.   {$ENDIF}
  130. {$ENDIF}
  131.   end;
  132. implementation
  133. uses DBConsts, {$IFDEF RX_D3} BDEConst, {$ENDIF} DBUtils, BdeUtils;
  134. function NameDelimiter(C: Char): Boolean;
  135. begin
  136.   Result := C in [' ', ',', ';', ')', '.', #13, #10];
  137. end;
  138. function IsLiteral(C: Char): Boolean;
  139. begin
  140.   Result := C in ['''', '"'];
  141. end;
  142. { TQBEQuery }
  143. constructor TQBEQuery.Create(AOwner: TComponent);
  144. begin
  145.   inherited Create(AOwner);
  146.   FQBE := TStringList.Create;
  147.   TStringList(QBE).OnChange := QueryChanged;
  148.   FParams := TParams.Create{$IFDEF RX_D4}(Self){$ENDIF};
  149.   FStartParam := DefQBEStartParam;
  150.   FParamCheck := True;
  151.   FAuxiliaryTables:= True;
  152. {$IFNDEF WIN32}
  153.   FText := nil;
  154. {$ELSE}
  155.   FRowsAffected := -1;
  156. {$ENDIF}
  157.   FRequestLive := False;
  158. end;
  159. destructor TQBEQuery.Destroy;
  160. begin
  161.   Destroying;
  162.   Disconnect;
  163.   QBE.Free;
  164. {$IFNDEF WIN32}
  165.   StrDispose(FText);
  166. {$ENDIF}
  167.   FParams.Free;
  168.   inherited Destroy;
  169. end;
  170. procedure TQBEQuery.Disconnect;
  171. begin
  172.   Close;
  173.   UnPrepare;
  174. end;
  175. procedure TQBEQuery.RefreshQuery;
  176. var
  177.   Bookmark: TBookmark;
  178. begin
  179.   DisableControls;
  180.   Bookmark := GetBookmark;
  181.   try
  182.     Close;
  183.     Open;
  184.     try
  185.       GotoBookmark(Bookmark);
  186.     except
  187.       { ignore exceptions }
  188.     end;
  189.   finally
  190.     FreeBookmark(Bookmark);
  191.     EnableControls;
  192.   end;
  193. end;
  194. procedure TQBEQuery.SetPrepare(Value: Boolean);
  195. begin
  196.   if Value then Prepare
  197.   else UnPrepare;
  198. end;
  199. procedure TQBEQuery.Prepare;
  200. begin
  201.   SetDBFlag(dbfPrepared, True);
  202.   SetPrepared(True);
  203. end;
  204. procedure TQBEQuery.UnPrepare;
  205. begin
  206.   SetPrepared(False);
  207.   SetDBFlag(dbfPrepared, False);
  208. end;
  209. procedure TQBEQuery.SetStartParam(Value: Char);
  210. begin
  211.   if Value <> FStartParam then begin
  212.     FStartParam := Value;
  213.     QueryChanged(nil);
  214.   end;
  215. end;
  216. procedure TQBEQuery.SetQuery(Value: TStrings);
  217. begin
  218. {$IFDEF WIN32}
  219.   if QBE.Text <> Value.Text then begin
  220. {$ENDIF}
  221.     Disconnect;
  222.     TStringList(QBE).OnChange := nil;
  223.     QBE.Assign(Value);
  224.     TStringList(QBE).OnChange := QueryChanged;
  225.     QueryChanged(nil);
  226. {$IFDEF WIN32}
  227.   end;
  228. {$ENDIF}
  229. end;
  230. procedure TQBEQuery.QueryChanged(Sender: TObject);
  231. var
  232.   List: TParams;
  233. begin
  234. {$IFDEF RX_D4}
  235.   if not (csReading in ComponentState) then begin
  236. {$ENDIF RX_D4}
  237.     Disconnect;
  238.   {$IFDEF WIN32}
  239.     FText := QBE.Text;
  240.   {$ELSE}
  241.     StrDispose(FText);
  242.     FText := QBE.GetText;
  243.   {$ENDIF WIN32}
  244.     if ParamCheck or (csDesigning in ComponentState) then begin
  245.       List := TParams.Create{$IFDEF RX_D4}(Self){$ENDIF};
  246.       try
  247.         CreateParams(List, PChar(Text));
  248.         List.AssignValues(FParams);
  249.     {$IFDEF RX_D4}
  250.         FParams.Clear;
  251.         FParams.Assign(List);
  252.       finally
  253.     {$ELSE}
  254.         FParams.Free;
  255.         FParams := List;
  256.       except
  257.     {$ENDIF RX_D4}
  258.         List.Free;
  259.       end;
  260.     end;
  261. {$IFDEF RX_D4}
  262.     DataEvent(dePropertyChange, 0);
  263.   end
  264.   else begin
  265.     FText := QBE.Text;
  266.     FParams.Clear;
  267.     CreateParams(FParams, PChar(Text));
  268.   end;
  269. {$ENDIF RX_D4}
  270. end;
  271. procedure TQBEQuery.SetParamsList(Value: TParams);
  272. begin
  273.   FParams.AssignValues(Value);
  274. end;
  275. {$IFDEF RX_D4}
  276. procedure TQBEQuery.DefineProperties(Filer: TFiler);
  277. begin
  278.   inherited DefineProperties(Filer);
  279.   Filer.DefineProperty('ParamData', ReadParamData, WriteParamData, True);
  280. end;
  281. procedure TQBEQuery.ReadParamData(Reader: TReader);
  282. begin
  283.   Reader.ReadValue;
  284.   Reader.ReadCollection(FParams);
  285. end;
  286. procedure TQBEQuery.WriteParamData(Writer: TWriter);
  287. begin
  288.   Writer.WriteCollection(Params);
  289. end;
  290. {$ENDIF}
  291. function TQBEQuery.GetParamsCount: Word;
  292. begin
  293.   Result := FParams.Count;
  294. end;
  295. procedure TQBEQuery.ReplaceParams(QBEText: TStrings);
  296.   function ReplaceString(const S: string): string;
  297.   var
  298.     I, J, P, LiteralChars: Integer;
  299.     Param: TParam;
  300.     Temp: string;
  301.     Found: Boolean;
  302.   begin
  303.     Result := S;
  304.     for I := Params.Count - 1 downto 0 do begin
  305.       Param := Params[I];
  306.       if Param.DataType = ftUnknown then
  307.         Continue; { ignore undefined params }
  308.       repeat
  309.         P := Pos(StartParam + Param.Name, Result);
  310.         Found := (P > 0) and ((Length(Result) = P + Length(Param.Name)) or
  311.           NameDelimiter(Result[P + Length(Param.Name) + 1]));
  312.         if Found then begin
  313.           LiteralChars := 0;
  314.           for J := 1 to P - 1 do
  315.             if IsLiteral(Result[J]) then Inc(LiteralChars);
  316.           Found := LiteralChars mod 2 = 0;
  317.           if Found then begin
  318.             Temp := Param.Text;
  319.             if Temp = '' then begin
  320.               if (Param.DataType = ftString) and not Param.IsNull then
  321.                 Temp := '""'
  322.               else Temp := 'BLANK'; { special QBE operator }
  323.             end;
  324.             Result := Copy(Result, 1, P - 1) + Temp + Copy(Result,
  325.               P + Length(Param.Name) + 1, MaxInt);
  326.           end;
  327.         end;
  328.       until not Found;
  329.     end;
  330.   end;
  331. var
  332.   I: Integer;
  333. begin
  334.   for I := 0 to QBEText.Count - 1 do
  335.     QBEText[I] := ReplaceString(QBEText[I]);
  336. end;
  337. procedure TQBEQuery.SetPrepared(Value: Boolean);
  338. var
  339.   TempQBE: TStrings;
  340.   AText: PChar;
  341. begin
  342.   if Handle <> nil then _DBError(SDataSetOpen);
  343.   if (Value <> Prepared) or (ParamCount > 0) then begin
  344.     if Value then begin
  345. {$IFDEF WIN32}
  346.       FRowsAffected := -1;
  347. {$ENDIF}
  348.       if ParamCount > 0 then begin
  349.         TempQBE := TStringList.Create;
  350.         try
  351.           TempQBE.Assign(QBE);
  352.           ReplaceParams(TempQBE);
  353. {$IFDEF WIN32}
  354.           AText := PChar(TempQBE.Text);
  355. {$ELSE}
  356.           AText := TempQBE.GetText;
  357. {$ENDIF}
  358.           try
  359.             FreeStatement;
  360.             if StrLen(AText) > 1 then PrepareQBE(AText)
  361.             else _DBError(SEmptySQLStatement);
  362.           finally
  363. {$IFNDEF WIN32}
  364.             StrDispose(AText);
  365. {$ENDIF}
  366.           end;
  367.         finally
  368.           TempQBE.Free;
  369.         end;
  370.       end
  371.       else begin
  372.         if StrLen(PChar(Text)) > 1 then PrepareQBE(PChar(Text))
  373.         else _DBError(SEmptySQLStatement);
  374.       end;
  375.     end
  376.     else begin
  377. {$IFDEF WIN32}
  378.       FRowsAffected := RowsAffected;
  379. {$ENDIF}
  380.       FreeStatement;
  381.     end;
  382.     FPrepared := Value;
  383.   end;
  384. end;
  385. procedure TQBEQuery.FreeStatement;
  386. begin
  387.   if StmtHandle <> nil then begin
  388.     DbiQFree(FStmtHandle);
  389.     FStmtHandle := nil;
  390.   end;
  391. end;
  392. function TQBEQuery.ParamByName(const Value: string): TParam;
  393. begin
  394.   Result := FParams.ParamByName(Value);
  395. end;
  396. procedure TQBEQuery.CreateParams(List: TParams; const Value: PChar);
  397. var
  398.   CurPos, StartPos: PChar;
  399.   CurChar: Char;
  400.   Literal: Boolean;
  401.   EmbeddedLiteral: Boolean;
  402.   Name: string;
  403.   function StripLiterals(Buffer: PChar): string;
  404.   var
  405.     Len: Word;
  406.     TempBuf: PChar;
  407.     procedure StripChar(Value: Char);
  408.     begin
  409.       if TempBuf^ = Value then
  410.         StrMove(TempBuf, TempBuf + 1, Len - 1);
  411.       if TempBuf[StrLen(TempBuf) - 1] = Value then
  412.         TempBuf[StrLen(TempBuf) - 1] := #0;
  413.     end;
  414.   begin
  415.     Len := StrLen(Buffer) + 1;
  416.     TempBuf := AllocMem(Len);
  417.     Result := '';
  418.     try
  419.       StrCopy(TempBuf, Buffer);
  420.       StripChar('''');
  421.       StripChar('"');
  422.       Result := StrPas(TempBuf);
  423.     finally
  424.       FreeMem(TempBuf, Len);
  425.     end;
  426.   end;
  427. begin
  428.   CurPos := Value;
  429.   Literal := False;
  430.   EmbeddedLiteral := False;
  431.   repeat
  432.     CurChar := CurPos^;
  433.     if (CurChar = FStartParam) and not Literal and
  434.       ((CurPos + 1)^ <> FStartParam) then
  435.     begin
  436.       StartPos := CurPos;
  437.       while (CurChar <> #0) and (Literal or not NameDelimiter(CurChar)) do
  438.       begin
  439.         Inc(CurPos);
  440.         CurChar := CurPos^;
  441.         if IsLiteral(CurChar) then begin
  442.           Literal := Literal xor True;
  443.           if CurPos = StartPos + 1 then EmbeddedLiteral := True;
  444.         end;
  445.       end;
  446.       CurPos^ := #0;
  447.       if EmbeddedLiteral then begin
  448.         Name := StripLiterals(StartPos + 1);
  449.         EmbeddedLiteral := False;
  450.       end
  451.       else Name := StrPas(StartPos + 1);
  452. {$IFDEF RX_D4}
  453.       if List.FindParam(Name) = nil then
  454. {$ENDIF}
  455.         List.CreateParam(ftUnknown, Name, ptUnknown);
  456.       CurPos^ := CurChar;
  457.       StartPos^ := '?';
  458.       Inc(StartPos);
  459.       StrMove(StartPos, CurPos, StrLen(CurPos) + 1);
  460.       CurPos := StartPos;
  461.     end
  462.     else if (CurChar = FStartParam) and not Literal
  463.       and ((CurPos + 1)^ = FStartParam) then
  464.       StrMove(CurPos, CurPos + 1, StrLen(CurPos) + 1)
  465.     else if IsLiteral(CurChar) then Literal := Literal xor True;
  466.     Inc(CurPos);
  467.   until CurChar = #0;
  468. end;
  469. {$IFNDEF RX_D3}
  470. function TQBEQuery.IsEmpty: Boolean;
  471. begin
  472.   Result := IsDataSetEmpty(Self);
  473. end;
  474. {$ENDIF}
  475. function TQBEQuery.CreateCursor(GenHandle: Boolean): HDBICur;
  476. begin
  477.   if QBE.Count > 0 then begin
  478.     SetPrepared(True);
  479.     Result := GetQueryCursor(GenHandle);
  480.   end
  481.   else Result := nil;
  482. end;
  483. function TQBEQuery.CreateHandle: HDBICur;
  484. begin
  485.   Result := CreateCursor(True)
  486. end;
  487. procedure TQBEQuery.ExecQBE;
  488. begin
  489.   CheckInActive;
  490.   SetDBFlag(dbfExecSQL, True);
  491.   try
  492.     CreateCursor(False);
  493.   finally
  494.     SetDBFlag(dbfExecSQL, False);
  495.   end;
  496. end;
  497. function TQBEQuery.GetQueryCursor(GenHandle: Boolean): HDBICur;
  498. var
  499.   PCursor: phDBICur;
  500. begin
  501.   Result := nil;
  502.   if GenHandle then PCursor := @Result
  503.   else PCursor := nil;
  504.   Check(DbiQExec(StmtHandle, PCursor));
  505. end;
  506. {$IFDEF RX_V110}
  507. function TQBEQuery.SetDBFlag(Flag: Integer; Value: Boolean): Boolean;
  508. {$ELSE}
  509. procedure TQBEQuery.SetDBFlag(Flag: Integer; Value: Boolean);
  510. {$ENDIF}
  511. var
  512.   NewConnection: Boolean;
  513. begin
  514.   if Value then begin
  515.     NewConnection := DBFlags = [];
  516. {$IFDEF RX_V110}
  517.     Result := inherited SetDBFlag(Flag, Value);
  518. {$ELSE}
  519.     inherited SetDBFlag(Flag, Value);
  520. {$ENDIF}
  521.     if not (csReading in ComponentState) and NewConnection then
  522.       FLocal := not Database.IsSQLBased;
  523.   end
  524.   else begin
  525.     if DBFlags - [Flag] = [] then SetPrepared(False);
  526. {$IFDEF RX_V110}
  527.     Result := inherited SetDBFlag(Flag, Value);
  528. {$ELSE}
  529.     inherited SetDBFlag(Flag, Value);
  530. {$ENDIF}
  531.   end;
  532. end;
  533. procedure TQBEQuery.PrepareQBE(Value: PChar);
  534. begin
  535.   GetStatementHandle(Value);
  536. end;
  537. procedure TQBEQuery.GetStatementHandle(QBEText: PChar);
  538. const
  539.   DataType: array[Boolean] of LongInt = (Ord(wantCanned), Ord(wantLive));
  540. begin
  541. {$IFDEF WIN32}
  542.   Check(DbiQAlloc(DBHandle, qrylangQBE, FStmtHandle));
  543.   try
  544.     Check(DBiSetProp(hDbiObj(StmtHandle), stmtLIVENESS,
  545.       DataType[RequestLive and not ForceUpdateCallback]));
  546.     Check(DBiSetProp(hDbiObj(StmtHandle), stmtAUXTBLS, Longint(FAuxiliaryTables)));
  547. {$IFDEF RX_D3}
  548.     if Local and RequestLive and Constrained then
  549.       Check(DBiSetProp(hDbiObj(StmtHandle), stmtCONSTRAINED, LongInt(True)));
  550. {$ENDIF}
  551.     if FBlankAsZero then
  552.       Check(DbiSetProp(hDbiObj(StmtHandle), stmtBLANKS, Longint(True)));
  553.     while not CheckOpen(DbiQPrepare(FStmtHandle, QBEText)) do {Retry};
  554.   except
  555.     DbiQFree(FStmtHandle);
  556.     FStmtHandle := nil;
  557.     raise;
  558.   end;
  559. {$ELSE}
  560.   if Local then begin
  561.     while not CheckOpen(DbiQPrepare(DBHandle, qrylangQBE, QBEText,
  562.       FStmtHandle)) do {Retry};
  563.     Check(DBiSetProp(hDbiObj(StmtHandle), stmtLIVENESS, DataType[RequestLive]));
  564.   end
  565.   else begin
  566.     if RequestLive then
  567.       Check(DbiQPrepareExt(DBHandle, qrylangQBE, QBEText, qprepFORUPDATE, FStmtHandle))
  568.     else Check(DbiQPrepare(DBHandle, qrylangQBE, QBEText, FStmtHandle));
  569.   end;
  570.   Check(DBiSetProp(hDbiObj(StmtHandle), stmtAUXTBLS, Longint(FAuxiliaryTables)));
  571.   if FBlankAsZero then
  572.     Check(DbiSetProp(hDbiObj(StmtHandle), stmtBLANKS, LongInt(True)));
  573. {$ENDIF}
  574. end;
  575. function TQBEQuery.GetQBEText: PChar;
  576. var
  577.   BufLen: Word;
  578.   I: Integer;
  579.   StrEnd: PChar;
  580.   StrBuf: array[0..255] of Char;
  581. begin
  582.   BufLen := 1;
  583.   for I := 0 to QBE.Count - 1 do
  584.     Inc(BufLen, Length(QBE.Strings[I]) + 1);
  585.   Result := StrAlloc(BufLen);
  586.   try
  587.     StrEnd := Result;
  588.     for I := 0 to QBE.Count - 1 do begin
  589.       StrPCopy(StrBuf, QBE.Strings[I]);
  590.       StrEnd := StrECopy(StrEnd, StrBuf);
  591.       StrEnd := StrECopy(StrEnd, ' ');
  592.     end;
  593.   except
  594.     StrDispose(Result);
  595.     raise;
  596.   end;
  597. end;
  598. {$IFDEF WIN32}
  599. function TQBEQuery.GetRowsAffected: Integer;
  600. var
  601.   Length: Word;
  602. begin
  603.   if Prepared then
  604.     if DbiGetProp(hDBIObj(StmtHandle), stmtROWCOUNT, @Result, SizeOf(Result),
  605.       Length) <> 0 then Result := -1
  606.     else
  607.   else Result := FRowsAffected;
  608. end;
  609. {$ENDIF}
  610. {$IFDEF RX_D5}
  611. { TQBEQuery.IProviderSupport }
  612. function TQBEQuery.PSGetParams: TParams;
  613. begin
  614.   Result := Params;
  615. end;
  616. procedure TQBEQuery.PSSetParams(AParams: TParams);
  617. begin
  618.   if AParams.Count <> 0 then
  619.     Params.Assign(AParams);
  620.   Close;
  621. end;
  622. procedure TQBEQuery.PSExecute;
  623. begin
  624.   ExecQBE;
  625. end;
  626. procedure TQBEQuery.PSSetCommandText(const CommandText: string);
  627. begin
  628.   if CommandText <> '' then
  629.     QBE.Text := CommandText;
  630. end;
  631. {$ENDIF RX_D5}
  632. end.