Delphi 如何在不移动光标的情况下读取TDataSet子体的字段值

Delphi 如何在不移动光标的情况下读取TDataSet子体的字段值,delphi,random,tdataset,Delphi,Random,Tdataset,我认为,对于使用数据库应用程序的人来说,能够从TDataSet子体读取记录值而不必移动光标是一个很大的改进 我已经在这个主题上搜索了很长时间,但我能找到的最接近的是XE7 TFDMemTable,在这里,您可以通过以下语句读取字段值: FirstName := fdsPeople.Table.Rows.ItemsI[i].GetValues('FirstName', True); var BM: TBookmark; begin BM := Dataset.GetBookmark;

我认为,对于使用数据库应用程序的人来说,能够从TDataSet子体读取记录值而不必移动光标是一个很大的改进

我已经在这个主题上搜索了很长时间,但我能找到的最接近的是XE7 TFDMemTable,在这里,您可以通过以下语句读取字段值:

FirstName := fdsPeople.Table.Rows.ItemsI[i].GetValues('FirstName', True);
var
  BM: TBookmark;
begin
  BM := Dataset.GetBookmark;
  Dataset.DisableControls;
  try
    // Simulate moving the cursor around, reading data etc.
    Dataset.Last;
    Dataset.First;
    Dataset.GotoBookmark(BM)
  finally
    Dataset.EnableControls;
  end;
end;
在哪里

  • fdsPeople=TFDMemTable的实例
  • i=引用记录索引的整数
  • FirstName是一个字符串变量

  • 是否已经有一种方法可以通过我不知道的TDataSet实现这一点?如果没有,我们如何请求此功能?

    假设您的意思是不希望用户看到您实际移动光标,您可以执行以下操作:

    FirstName := fdsPeople.Table.Rows.ItemsI[i].GetValues('FirstName', True);
    
    var
      BM: TBookmark;
    begin
      BM := Dataset.GetBookmark;
      Dataset.DisableControls;
      try
        // Simulate moving the cursor around, reading data etc.
        Dataset.Last;
        Dataset.First;
        Dataset.GotoBookmark(BM)
      finally
        Dataset.EnableControls;
      end;
    end;
    

    当然,这是假设您有一个双向数据集。

    假设您的意思是不希望用户看到您实际上正在移动光标,您可以执行以下操作:

    FirstName := fdsPeople.Table.Rows.ItemsI[i].GetValues('FirstName', True);
    
    var
      BM: TBookmark;
    begin
      BM := Dataset.GetBookmark;
      Dataset.DisableControls;
      try
        // Simulate moving the cursor around, reading data etc.
        Dataset.Last;
        Dataset.First;
        Dataset.GotoBookmark(BM)
      finally
        Dataset.EnableControls;
      end;
    end;
    

    当然,这假设您有一个双向数据集。

    若您的数据集后代支持此功能,您可以将光标从数据集克隆到其他数据集。(AnyDAC-TADMemTable或FireDAC-TFDMemTable和TClientDataset支持此功能)

    这意味着数据集可以共享数据,但它们有不同的游标!(您可以在不干扰其他数据集的情况下浏览一个数据集recNo)

    例如:

    procedure MyCloneCursor(ASourceDS, ADestDS: TFDMemTable)
    begin
     ADestDS.FieldDefs.Assign(ASourceDS.FieldDefs);
     ADestDS.CreateDataset;
    
     ADestDS.CloneCursor(ASourceDS, false {Reset}, false {KeepSettings});
    end;
    
    请注意,KeepSettings指的是克隆游标的数据集。 KeepSettings,如果为true,则表示克隆光标的数据集将保留其设置,如果为false,则将从克隆光标的数据集中获取设置

    如果要克隆筛选器、索引、主源、主字段、源数据集的只读状态。。。然后按如下方式调用CloneCursor

    CloneCursor(SourceDataset, False, False);
    

    有关这方面的详细文档,请阅读Cary Jensen的

    您可以将光标从数据集克隆到其他数据集,当然前提是您的数据集后代支持此功能。(AnyDAC-TADMemTable或FireDAC-TFDMemTable和TClientDataset支持此功能)

    这意味着数据集可以共享数据,但它们有不同的游标!(您可以在不干扰其他数据集的情况下浏览一个数据集recNo)

    例如:

    procedure MyCloneCursor(ASourceDS, ADestDS: TFDMemTable)
    begin
     ADestDS.FieldDefs.Assign(ASourceDS.FieldDefs);
     ADestDS.CreateDataset;
    
     ADestDS.CloneCursor(ASourceDS, false {Reset}, false {KeepSettings});
    end;
    
    请注意,KeepSettings指的是克隆游标的数据集。 KeepSettings,如果为true,则表示克隆光标的数据集将保留其设置,如果为false,则将从克隆光标的数据集中获取设置

    如果要克隆筛选器、索引、主源、主字段、源数据集的只读状态。。。然后按如下方式调用CloneCursor

    CloneCursor(SourceDataset, False, False);
    

    有关这方面的详细文档,请阅读Cary Jensen的

    这只适用于整个表都在内存中的内存表(因此得名)。其他TDataset可能在内存中有一些行用于缓存(它们很可能会更改),但很少有整个表可用。但是为什么您认为不移动光标是一个很大的改进呢?对于一般的TDataSet Decedant还是TClientDataSet,您真的需要这样做吗?在后一种情况下,您可以使用CloneCursor()创建一个可跳转的克隆TClientDataSet。这只适用于整个表都在内存中的内存表(因此得名)。其他TDataset可能在内存中有一些行用于缓存(它们很可能会更改),但很少有整个表可用。但是为什么您认为不移动光标是一个很大的改进呢?对于一般的TDataSet Decedant还是TClientDataSet,您真的需要这样做吗?在后一种情况下,您可以使用C克隆()来创建一个可以跳过的克隆Tclipse数据集。CoCurCurSuror函数是否重复使用内存,我想知道。CoCururSuror函数是否重复使用内存,我想知道。这似乎有太多的问题需要考虑(书签,DababelOntRLS,FooBooM签,EnabelCon)。我真的觉得NavaDeCo应该在TDATSET级别做一些事情。这似乎有太多的问题需要考虑(书签,DababelOntRLS,FooBooM签,EnabelCon)。我真的觉得Embarcadero应该在TDataSet级别做些事情。