📄 jvuib.pas
字号:
InternalClose(etmStayIn, True);
if (not FQuickScript or FParseParams) then
FParsedSQL := FParameter.Parse(FSQL.Text);
end;
function TJvUIBStatement.GetFields: TSQLResult;
begin
if (FSQLResult = nil) then
raise Exception.Create(EUIB_QUERYNOTOPEN);
Result := FSQLResult;
end;
function TJvUIBStatement.GetEof: boolean;
begin
if Assigned(FSQLResult) then
Result := FSQLResult.Eof else
Result := True;
end;
function TJvUIBStatement.GetBof: boolean;
begin
if Assigned(FSQLResult) then
Result := FSQLResult.Bof else
Result := True;
end;
function TJvUIBStatement.FindDataBase: TJvUIBDataBase;
begin
if FDataBase <> nil then
result := FDataBase else
if FTransaction <> nil then
result := FTransaction.FDataBase else
raise Exception.Create(EUIB_DATABASENOTDEF);
end;
procedure TJvUIBStatement.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if ((AComponent = FTransaction) and (Operation = opRemove)) then
SetTransaction(nil);
if ((AComponent = FDataBase) and (Operation = opRemove)) then
SetDataBase(nil);
end;
constructor TJvUIBStatement.Create(AOwner: TComponent);
begin
inherited;
FUseCursor := True;
FCurrentState := qsDataBase;
if (AOwner is TJvUIBTransaction) then
Transaction := TJvUIBTransaction(AOwner) else
FTransaction := nil;
FSQL := TStringList.Create;
TStringList(FSQL).OnChange := DoSQLChange;
FCachedFetch := True;
FetchBlobs := False;
FQuickScript := False;
FOnError := etmRollback;
FParameter := ParamsClass.Create;
FCursorName := '';
FBufferChunks := 1000;
FParseParams := True;
end;
destructor TJvUIBStatement.Destroy;
begin
FSQL.Free;
FParameter.Free;
FParameter := nil;
SetTransaction(nil);
inherited;
end;
procedure TJvUIBStatement.ReadBlob(const Index: Word; var Str: string);
begin
if Fields.FetchBlobs then
Fields.ReadBlob(Index, Str) else
InternalReadBlob(Fields, Index, str);
end;
procedure TJvUIBStatement.ReadBlob(const Index: Word; Stream: TStream);
begin
if Fields.FetchBlobs then
Fields.ReadBlob(Index, Stream) else
InternalReadBlob(Fields, Index, Stream);
end;
procedure TJvUIBStatement.ReadBlob(const Index: Word; var Value: Variant);
begin
if Fields.FetchBlobs then
Fields.ReadBlob(Index, Value) else
InternalReadBlob(Fields, Index, Value);
end;
procedure TJvUIBStatement.ReadBlob(const name: string; Stream: TStream);
begin
ReadBlob(Fields.GetFieldIndex(name), Stream);
end;
procedure TJvUIBStatement.ReadBlob(const name: string; var str: string);
begin
ReadBlob(Fields.GetFieldIndex(name), str);
end;
procedure TJvUIBStatement.ReadBlob(const name: string; var Value: Variant);
begin
ReadBlob(Fields.GetFieldIndex(name), Value);
end;
procedure TJvUIBStatement.ParamsSetBlob(const Index: Word; Stream: TStream);
var BlobHandle: IscBlobHandle;
begin
if (FCurrentState < qsTransaction) then
BeginTransaction;
BlobHandle := nil;
Lock;
with FindDataBase.FLibrary do
try
Params.AsQuad[Index] := BlobCreate(FindDataBase.FDbHandle,
FTransaction.FTrHandle, BlobHandle);
try
BlobWriteStream(BlobHandle, Stream);
finally
BlobClose(BlobHandle);
end;
finally
UnLock;
end;
end;
procedure TJvUIBStatement.ParamsSetBlob(const Index: Word; var str: string);
var BlobHandle: IscBlobHandle;
begin
if (FCurrentState < qsTransaction) then
BeginTransaction;
BlobHandle := nil;
Lock;
with FindDataBase.FLibrary do
try
Params.AsQuad[Index] := BlobCreate(FindDataBase.FDbHandle,
FTransaction.FTrHandle, BlobHandle);
try
BlobWriteString(BlobHandle, str);
finally
BlobClose(BlobHandle);
end;
finally
UnLock;
end;
end;
procedure TJvUIBStatement.ParamsSetBlob(const Index: Word; Buffer: Pointer;
Size: Cardinal);
var BlobHandle: IscBlobHandle;
begin
if (FCurrentState < qsTransaction) then
BeginTransaction;
BlobHandle := nil;
Lock;
with FindDataBase.FLibrary do
try
Params.AsQuad[Index] := BlobCreate(FindDataBase.FDbHandle,
FTransaction.FTrHandle, BlobHandle);
try
BlobWriteSegment(BlobHandle, Size, Buffer);
finally
BlobClose(BlobHandle);
end;
finally
UnLock;
end;
end;
procedure TJvUIBStatement.ParamsSetBlob(const Name: string; Stream: TStream);
var BlobHandle: IscBlobHandle;
begin
if (FCurrentState < qsTransaction) then
BeginTransaction;
BlobHandle := nil;
Lock;
with FindDataBase.FLibrary do
try
Params.ByNameAsQuad[Name] := BlobCreate(FindDataBase.FDbHandle,
FTransaction.FTrHandle, BlobHandle);
try
BlobWriteStream(BlobHandle, Stream);
finally
BlobClose(BlobHandle);
end;
finally
UnLock;
end;
end;
procedure TJvUIBStatement.ParamsSetBlob(const Name: string; var str: string);
var BlobHandle: IscBlobHandle;
begin
if (FCurrentState < qsTransaction) then
BeginTransaction;
BlobHandle := nil;
Lock;
with FindDataBase.FLibrary do
try
Params.ByNameAsQuad[Name] := BlobCreate(FindDataBase.FDbHandle,
FTransaction.FTrHandle, BlobHandle);
try
BlobWriteString(BlobHandle, str);
finally
BlobClose(BlobHandle);
end;
finally
UnLock;
end;
end;
procedure TJvUIBStatement.ParamsSetBlob(const Name: string; Buffer: Pointer;
Size: Cardinal);
var BlobHandle: IscBlobHandle;
begin
if (FCurrentState < qsTransaction) then
BeginTransaction;
BlobHandle := nil;
Lock;
with FindDataBase.FLibrary do
try
Params.ByNameAsQuad[Name] := BlobCreate(FindDataBase.FDbHandle,
FTransaction.FTrHandle, BlobHandle);
try
BlobWriteSegment(BlobHandle, Size, Buffer);
finally
BlobClose(BlobHandle);
end;
finally
UnLock;
end;
end;
procedure TJvUIBStatement.InternalReadBlob(sqlda: TSQLDA; const Index: Word;
Stream: TStream);
var
BlobHandle: IscBlobHandle;
begin
if (not sqlda.IsBlob[Index]) then
raise EUIBConvertError.Create(EUIB_CASTERROR);
if (not sqlda.IsNull[Index]) then
begin
Lock;
with FindDataBase.FLibrary do
try
BlobHandle := nil;
BlobOpen(FindDataBase.FDbHandle, FTransaction.FTrHandle,
BlobHandle, sqlda.AsQuad[Index]);
try
BlobSaveToStream(BlobHandle, Stream);
finally
BlobClose(BlobHandle);
end;
finally
UnLock;
end;
end;
end;
procedure TJvUIBStatement.InternalReadBlob(sqlda: TSQLDA; const Index: Word;
var str: string);
var
BlobHandle: IscBlobHandle;
begin
if (not sqlda.IsBlob[Index]) then
raise EUIBConvertError.Create(EUIB_CASTERROR);
if sqlda.IsNull[Index] then
str := '' else
begin
Lock;
with FindDataBase.FLibrary do
try
BlobHandle := nil;
BlobOpen(FindDataBase.FDbHandle, FTransaction.FTrHandle,
BlobHandle, sqlda.AsQuad[Index]);
try
BlobReadString(BlobHandle, str);
finally
BlobClose(BlobHandle);
end;
finally
UnLock;
end;
end;
end;
procedure TJvUIBStatement.InternalReadBlob(sqlda: TSQLDA; const Index: Word;
var Value: Variant);
var
BlobHandle: IscBlobHandle;
begin
if (not sqlda.IsBlob[Index]) then
raise EUIBConvertError.Create(EUIB_CASTERROR);
if (not sqlda.IsNull[Index]) then
begin
Lock;
with FindDataBase.FLibrary do
try
BlobHandle := nil;
BlobOpen(FindDataBase.FDbHandle, FTransaction.FTrHandle,
BlobHandle, sqlda.AsQuad[Index]);
try
BlobReadVariant(BlobHandle, Value);
finally
BlobClose(BlobHandle);
end;
finally
UnLock;
end;
end;
end;
procedure TJvUIBStatement.InternalClose(const Mode: TEndTransMode;
Auto: boolean);
begin
case FCurrentState of
qsStatement : EndStatement(Mode, Auto);
qsExecImme : EndExecImme(Mode, Auto);
qsPrepare : EndPrepare(Mode, Auto);
qsExecute : EndExecute(Mode, Auto);
end;
end;
procedure TJvUIBStatement.InternalGetBlobSize(sqlda: TSQLDA; const Index: Word; out Size: Cardinal);
var
BlobHandle: IscBlobHandle;
begin
if (not sqlda.IsBlob[Index]) then
raise EUIBConvertError.Create(EUIB_CASTERROR);
if (not sqlda.IsNull[Index]) then
begin
Lock;
with FindDataBase.FLibrary do
try
BlobHandle := nil;
BlobOpen(FindDataBase.FDbHandle, FTransaction.FTrHandle,
BlobHandle, sqlda.AsQuad[Index]);
try
BlobSize(BlobHandle, Size);
finally
BlobClose(BlobHandle);
end;
finally
UnLock;
end;
end;
end;
function TJvUIBStatement.FieldBlobSize(const Index: Word): Cardinal;
begin
if Fields.FetchBlobs then
Result := Fields.GetBlobSize(Index) else
InternalGetBlobSize(Fields, Index, Result);
end;
function TJvUIBStatement.ParamBlobSize(const Index: Word): Cardinal;
begin
InternalGetBlobSize(Params, Index, Result);
end;
procedure TJvUIBStatement.ReadBlob(const Index: Word; Buffer: Pointer);
begin
if Fields.FetchBlobs then
Fields.ReadBlob(Index, Buffer) else
InternalReadBlob(Fields, Index, Buffer);
end;
procedure TJvUIBStatement.ReadBlob(const name: string; Buffer: Pointer);
begin
ReadBlob(Fields.GetFieldIndex(name), Buffer);
end;
procedure TJvUIBStatement.InternalReadBlob(sqlda: TSQLDA;
const Index: Word; Buffer: Pointer);
var
BlobHandle: IscBlobHandle;
begin
if (not sqlda.IsBlob[Index]) then
raise EUIBConvertError.Create(EUIB_CASTERROR);
if sqlda.IsNull[Index] then
Exit else
begin
Lock;
with FindDataBase.FLibrary do
try
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -