📄 jvuiblib.pas
字号:
Lock;
try
CheckUIBApiCall(isc_prepare_transaction(@FStatusVector, @TraHandle));
finally
UnLock;
end;
end;
procedure TUIBLibrary.TransactionRollbackRetaining(var TraHandle: IscTrHandle);
begin
Lock;
try
CheckUIBApiCall(isc_rollback_retaining(@FStatusVector, @TraHandle));
finally
UnLock;
end;
end;
//******************************************************************************
// DSQL
//******************************************************************************
function GetSQLDAData(SQLDA: TSQLDA): Pointer;
begin
if (SQLDA <> nil) then
Result := SQLDA.FXSQLDA else
Result := nil;
end;
//****************************************
// API CALLS
//****************************************
procedure TUIBLibrary.DSQLExecuteImmediate(var DBHandle: IscDbHandle; var TraHandle: IscTrHandle;
const Statement: string; Dialect: Word; Sqlda: TSQLDA = nil);
begin
Lock;
try
CheckUIBApiCall(isc_dsql_execute_immediate(@FStatusVector, @DBHandle, @TraHandle,
length(Statement), Pointer(Statement), Dialect, GetSQLDAData(Sqlda)));
finally
UnLock;
end;
end;
procedure TUIBLibrary.DSQLExecuteImmediate(const Statement: string; Dialect: Word; Sqlda: TSQLDA = nil);
var p: pointer;
begin
Lock;
try
p := nil;
CheckUIBApiCall(isc_dsql_execute_immediate(@FStatusVector, @p, @p,
length(Statement), Pointer(Statement), Dialect, GetSQLDAData(Sqlda)));
finally
UnLock;
end;
end;
procedure TUIBLibrary.DSQLAllocateStatement(var DBHandle: IscDbHandle; var StmtHandle: IscStmtHandle);
begin
Lock;
try
CheckUIBApiCall(isc_dsql_allocate_statement(@FStatusVector, @DBHandle, @StmtHandle));
finally
UnLock;
end;
end;
function TUIBLibrary.DSQLPrepare(var TraHandle: IscTrHandle; var StmtHandle: IscStmtHandle;
Statement: string; Dialect: Word; Sqlda: TSQLResult = nil): TUIBStatementType;
var STInfo: packed record
InfoCode: byte;
InfoLen : Word; // isc_portable_integer convert a SmallInt to Word ??? so just say it is a word
InfoType: TUIBStatementType;
InfoIn: byte;
end;
begin
Lock;
try
CheckUIBApiCall(isc_dsql_prepare(@FStatusVector, @TraHandle, @StmtHandle, Length(Statement),
PChar(Statement), Dialect, GetSQLDAData(Sqlda)));
STInfo.InfoIn := isc_info_sql_stmt_type;
isc_dsql_sql_info(@FStatusVector, @StmtHandle, 1, @STInfo.InfoIn, SizeOf(STInfo), @STInfo);
dec(STInfo.InfoType);
Result := STInfo.InfoType;
finally
UnLock;
end;
if (Sqlda <> nil) then
begin
Sqlda.ClearRecords;
if (Sqlda.GetActualFields <> Sqlda.GetAllocatedFields) then
begin
Sqlda.SetAllocatedFields(Sqlda.FXSQLDA.sqld);
DSQLDescribe(StmtHandle, Dialect, Sqlda);
end else
Sqlda.AllocateDataBuffer;
end;
end;
procedure TUIBLibrary.DSQLExecute(var TraHandle: IscTrHandle; var StmtHandle: IscStmtHandle;
Dialect: Word; Sqlda: TSQLParams = nil);
begin
Lock;
try
CheckUIBApiCall(isc_dsql_execute(@FStatusVector, @TraHandle, @StmtHandle,
Dialect, GetSQLDAData(Sqlda)));
finally
UnLock;
end;
end;
procedure TUIBLibrary.DSQLExecute2(var TraHandle: IscTrHandle; var StmtHandle: IscStmtHandle; Dialect: Word;
InSqlda: TSQLParams; OutSqlda: TSQLResult);
begin
Lock;
try
CheckUIBApiCall(isc_dsql_execute2(@FStatusVector, @TraHandle, @StmtHandle, Dialect,
GetSQLDAData(InSqlda), GetSQLDAData(OutSqlda)));
finally
UnLock;
end;
end;
procedure TUIBLibrary.DSQLFreeStatement(var StmtHandle: IscStmtHandle; Option: Word);
begin
Lock;
try
CheckUIBApiCall(isc_dsql_free_statement(@FStatusVector, @StmtHandle, Option));
// if connection lost StmtHandle must be set manually to nil.
if option = DSQL_DROP then
StmtHandle := nil;
finally
UnLock;
end;
end;
function TUIBLibrary.DSQLFetch(var StmtHandle: IscStmtHandle; Dialect: Word; Sqlda: TSQLResult): boolean;
var Status: ISCStatus;
begin
Result := True;
if (Sqlda <> nil) then
Sqlda.FScrollEOF := False;
Lock;
try
Status := isc_dsql_fetch(@FStatusVector, @StmtHandle, Dialect, GetSQLDAData(Sqlda));
finally
UnLock;
end;
case Status of
0 : if (Sqlda <> nil) then
if Sqlda.FCachedFetch then
Sqlda.AddCurrentRecord;
100 :
begin
Result := False; // end of fetch
if (Sqlda <> nil) then
begin
Sqlda.FScrollEOF := True;
end;
end;
else
CheckUIBApiCall(Status);
end;
end;
function TUIBLibrary.DSQLFetchWithBlobs(var DBHhandle: IscDbHandle; var TraHandle: IscTrHandle;
var StmtHandle: IscStmtHandle; Dialect: Word; Sqlda: TSQLResult): boolean;
var
Status: ISCStatus;
BlobHandle: IscBlobHandle;
i: Integer;
begin
Result := True;
if (Sqlda <> nil) then
sqlda.FScrollEOF := False;
Lock;
try
Status := isc_dsql_fetch(@FStatusVector, @StmtHandle, Dialect, GetSQLDAData(Sqlda));
finally
UnLock;
end;
case Status of
0 :
begin
if (Sqlda <> nil) then
begin
// read blobs
for i := 0 to Length(Sqlda.FBlobsIndex) - 1 do
begin
// free previous blobs if not stored
if (not Sqlda.FCachedFetch) and // not stored
(Sqlda.FBlobArray[i].Size > 0) then // not null (null if the first one)
FreeMem(Sqlda.FBlobArray[i].Buffer);
if Sqlda.IsNull[Sqlda.FBlobsIndex[i]] then
begin
Sqlda.FBlobArray[i].Size := 0;
Sqlda.FBlobArray[i].Buffer := nil;
end else
begin
BlobHandle := nil;
BlobOpen(DBHhandle, TraHandle, BlobHandle, Sqlda.AsQuad[Sqlda.FBlobsIndex[i]]);
try
BlobReadBuffer(BlobHandle, Sqlda.FBlobArray[i].Size, Sqlda.FBlobArray[i].Buffer); // memory allocated here !!
finally
BlobClose(BlobHandle);
end;
end;
end;
// add to list after the blobs are fetched
if Sqlda.FCachedFetch then Sqlda.AddCurrentRecord;
end;
end;
100 :
begin
Result := False; // end of fetch
if (Sqlda <> nil) then
Sqlda.FScrollEOF := True;
end;
else
CheckUIBApiCall(Status);
end;
end;
procedure TUIBLibrary.DSQLDescribe(var StmtHandle: IscStmtHandle; Dialect: Word; Sqlda: TSQLResult);
begin
Lock;
try
CheckUIBApiCall(isc_dsql_describe(@FStatusVector, @StmtHandle, Dialect, GetSQLDAData(Sqlda)));
finally
UnLock;
end;
if (Sqlda <> nil) then
Sqlda.AllocateDataBuffer;
end;
procedure TUIBLibrary.DSQLDescribeBind(var StmtHandle: IscStmtHandle; Dialect: Word; Sqlda: TSQLDA);
begin
Lock;
try
CheckUIBApiCall(isc_dsql_describe_bind(@FStatusVector, @StmtHandle, Dialect,
GetSQLDAData(Sqlda)));
finally
UnLock;
end;
end;
procedure TUIBLibrary.DSQLSetCursorName(var StmtHandle: IscStmtHandle; const cursor: string);
begin
Lock;
try
CheckUIBApiCall(isc_dsql_set_cursor_name(@FStatusVector, @StmtHandle, PChar(cursor), 0));
finally
UnLock;
end;
end;
procedure TUIBLibrary.DSQLExecImmed2(var DBHhandle: IscDbHandle; var TraHandle: IscTrHandle;
const Statement: string; dialect: Word; InSqlda, OutSqlda: TSQLDA);
begin
Lock;
try
CheckUIBApiCall(isc_dsql_exec_immed2(@FStatusVector, @DBHhandle, @TraHandle, Length(Statement),
PChar(Statement), dialect, GetSQLDAData(InSqlda), GetSQLDAData(OutSqlda)));
finally
UnLock;
end;
end;
procedure TUIBLibrary.DSQLInfo(var StmtHandle: IscStmtHandle; const Items: array of byte; var buffer: String);
begin
Lock;
try
CheckUIBApiCall(isc_dsql_sql_info(@FStatusVector, @StmtHandle, Length(Items), @Items[0],
Length(buffer), PChar(buffer)));
finally
UnLock;
end;
end;
function TUIBLibrary.DSQLInfoPlan(var StmtHandle: IscStmtHandle): string;
var
STInfo : packed record
InfoCode: byte;
InfoLen : Word;
PlanDesc: array[0..1024] of Char;
end;
InfoType: Byte;
begin
InfoType := isc_info_sql_get_plan;
Lock;
try
CheckUIBApiCall(isc_dsql_sql_info(@FStatusVector, @StmtHandle, 1, @InfoType,
SizeOf(STInfo), @STInfo));
finally
UnLock;
end;
SetString(Result, PChar(@STInfo.PlanDesc[1]), STInfo.InfoLen - 1);
end;
function TUIBLibrary.DSQLInfoStatementType(var StmtHandle: IscStmtHandle): TUIBStatementType;
var STInfo: packed record
InfoCode: byte;
InfoLen : Word;
InfoType: TUIBStatementType;
InfoIn: byte;
end;
begin
STInfo.InfoIn := isc_info_sql_stmt_type;
Lock;
try
C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -