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

标签 delphi delphi-xe tclientdataset

我有一个包含多条记录的 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/

相关文章:

delphi - 使用 Delphi 将文件上传到 Amazon S3

delphi - 如何在同时处理多个位图的同时提高性能?

delphi - 访问 Delphi 应用程序中 DLL 中加载的 TClientDataset 的内容

delphi - 过滤客户端数据集中记录为 false 的记录

delphi - 判断ClientDataSet有变化的快速方法

Delphi 声明项目中的单元 (DPR) 整个解决方案可见

c# - Delphi SOAP 信封和 WCF

delphi - 随着 TDictionary 的不断增长,如何避免内存不足?

delphi - 是否有一个组件可以显示在 Delphi XE 中存储为资源的嵌入式 swf(Flash 文件)?

delphi - 使用继承的接口(interface)作为 TDictionary 中的键