gpt4 book ai didi

delphi - 使用 poFetchBlobsOnDemand 时检查是否已获取 Blob 字段的正确方法

转载 作者:行者123 更新时间:2023-12-03 15:01:37 24 4
gpt4 key购买 nike

我有一个包含多条记录的 TClientDataSet,我希望加载所有记录,但按需加载 blob 字段,一次加载一个。

我注意到调用 FetchBlobs 两次会获取 Blob 两次,而且检查字段的 IsNull 属性总是返回 False。

所以到目前为止我找到的唯一解决方案是访问 Value 或 BlobSize 这样的属性,如果尚未获取 Blob,则会引发 EDBClient 异常,并显示消息“Blob 尚未获取”,因此,如果引发此异常,我调用 FetchBlob。

有更好的方法吗?

  try
cdsIMG.BlobSize;
except
on E: EDBClient do
cds.FetchBlobs;
end;

最佳答案

我不确定这是否100%正确,但这是我能做的最好的了。亲自看看。

type
THackCustomClientDataSet = class(TCustomClientDataSet);

function IsBlobFetched(DataSet: TCustomClientDataSet; BlobField: TField): Boolean;
var
I: Integer;
Status: DBResult;
BlobLen: Cardinal;
begin
Result := False;
BlobLen := 0;

with THackCustomClientDataSet(DataSet) do
if Assigned(DSCursor) and (ActiveBuffer <> nil) then
begin
Status := DSCursor.GetBlobLen(ActiveBuffer, BlobField.FieldNo, BlobLen);
case Status of
DBERR_NONE:
Result := True;
DBERR_BLOBNOTFETCHED:
;
else
Check(Status);
end;
end;
end;

DSIntf 单元中似乎定义了 DBERR_BLOBNOTFETCHED,以便在尚未获取 Blob 的情况下由 GetBlobLen 返回。因此,返回代码意味着“未获取 blob”,成功返回代码意味着“已获取 blob”,任何其他错误代码可能表示其他错误。受到 TCustomClientDataSet.CreateBlobStream 的启发。

关于delphi - 使用 poFetchBlobsOnDemand 时检查是否已获取 Blob 字段的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6283738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com