Componentes.Terceros.jvcl/official/3.32/examples/JvUIB/API/api2.dpr

141 lines
4.0 KiB
ObjectPascal

(*
* Program type: API Interface
*
* Description:
* This program adds several departments with small default
* budgets, using 'execute immediate' statement.
* Then, a prepared statement, which doubles budgets for
* departments with low budgets, is executed.
* The contents of this file are subject to the Interbase Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy
* of the License at:
* http://www.borland.com/devsupport/interbase/opensource/IPL.html
*
* Software distributed under the License is distributed on an
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
* or implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code was created by Borland Software Corporation
* and its predecessors. Portions created by Borland are Copyright (c)
* 1994 - 2001 Borland Software Corporation.
* All rights reserved.
*
* Contributor(s):
* Aaron Ruddick InterBase QA, Borland Software Corp.
* Dan Mikhayltsa InterBase QA, Borland Software Corp.
*)
program api2;
{$APPTYPE CONSOLE}
uses
SysUtils,
JvUIBase,
JvUIBLib;
var
DB: IscDbHandle = nil; // database handle
trans: IscTrHandle = nil; // transaction handle
Db_name: string;
n: Integer = 0;
exec_str: string;
prep_str: string;
double_budget: IscStmtHandle = nil; // statement handle
FLibrary: TUIBLibrary;
(*
* Delete old data.
*)
procedure Cleanup;
begin
FLibrary.TransactionStart(trans, DB);
FLibrary.DSQLExecuteImmediate(DB, trans, 'DELETE FROM department WHERE dept_no IN ("117", "118", "119")', 1, nil);
FLibrary.TransactionCommit(trans);
end;
(*
* Construct an 'insert' statement from the supplied parameters.
*)
function getline(out line: string; Number: Integer): boolean;
type
TDept = record
Num: byte;
Dep: string;
Head: Byte;
end;
const
Data: array[0..2] of TDept =
((Num: 117; Dep: 'Field Office: Hong Kong'; Head: 110),
(Num: 118; Dep: 'Field Office: Australia'; Head: 110),
(Num: 119; Dep: 'Field Office: New Zealand'; Head: 110));
begin
result := false;
if not (Number in [0..2]) then Exit;
with Data[Number] do
line := Format('INSERT INTO DEPARTMENT (dept_no, department, head_dept) VALUES ("%d", "%s", "%d")', [Num, Dep, Head]);
result := True;
end;
begin
FLibrary := TUIBLibrary.Create;
try
if (ParamCount > 1) then
Db_name := ParamStr(1) else
Db_name := 'D:\Unified Interbase\demo\Database\employee.db';
FLibrary.AttachDatabase(Db_name, DB, 'user_name=SYSDBA;password=masterkey');
Cleanup;
(*
* Prepare a statement, which may be executed more than once.
*)
prep_str := 'UPDATE DEPARTMENT SET budget = budget * 2 WHERE budget < 100000';
(* Allocate a statement. *)
FLibrary.DSQLAllocateStatement(DB, double_budget);
FLibrary.TransactionStart(trans, DB);
(* Prepare the statement. *)
FLibrary.DSQLPrepare(trans, double_budget, prep_str, 1, nil);
(*
* Add new departments, using 'execute immediate'.
* Build each 'insert' statement, using the supplied parameters.
* Since these statements will not be needed after they are executed,
* use 'execute immediate'.
*)
while (getline(exec_str, n)) do
begin
Writeln(format('Executing statement:'#13'%d: %s;', [n, exec_str]));
FLibrary.DSQLExecuteImmediate(DB, trans, exec_str, 1, nil);
inc(n);
end;
(*
* Execute a previously prepared statement.
*)
Writeln('Executing a prepared statement:'#13 + prep_str);
FLibrary.DSQLExecute(trans, double_budget, 1);
FLibrary.DSQLFreeStatement(double_budget, DSQL_drop);
FLibrary.TransactionCommit(trans);
FLibrary.DetachDatabase(DB);
ReadLn;
finally
FLibrary.Free;
end;
end.