delphi - 带有流字段的重复 TADODataSet 组件?

标签 delphi delphi-7 tadodataset

我有一个与 this 非常相似的代码复制 TADODataSet 组件及其事件。

因此,如果我有一个 ADODataSet1,我想创建一个新实例 ADODataSet2 作为前一个组件的精确重复组件。

一切正常,但我仍然无法复制流字段(ADODataSet1PollIDADODataSet1TitleADODataSet1Description):

object ADODataSet1: TADODataSet
  Connection = ADOConnection1
  CursorType = ctStatic
  AfterOpen = ADODataSet1AfterOpen
  CommandText = 'select top 10  * from Polls'
  Parameters = <>
  Left = 224
  Top = 40
  object ADODataSet1PollID: TGuidField
    FieldName = 'PollID'
    FixedChar = True
    Size = 38
  end
  object ADODataSet1Title: TWideStringField
    FieldName = 'Title'
    Size = 255
  end
  object ADODataSet1Description: TWideStringField
    FieldName = 'Description'
    Size = 4000
  end      
end

我遇到的另一个问题是,如果将 ADODataSet1 设置为 Active=True,那么当我调用 ms.ReadComponent(Dest) 时,Active Connection 之前,并引发异常缺少连接或 ConnectionString ”。在编写 ms.WriteComponent(Source) 后,如何将 Active 设置为 False? (解决方法是在复制之前设置 ADODataSet1.Active := False)。

注意:我不想想要clone the cursor/recordset在数据集(TADODataSet.Clone)上,所以请不要将其视为“重复问题”。

最佳答案

试试这个:

Procedure registerAllClass(CMP: TComponent);
var
  I:Integer;
begin
  if (CMP is TPersistent) then begin
    RegisterClass(TPersistentclass(cmp.ClassType));
  end;
  for I:=0 to CMP.ComponentCount-1 do
    registerAllClass(cmp.Components[i]);
end;

function DuplicateComponent(Component: TComponent): TComponent;
var
  MemStream: TMemoryStream;
  oldname:String;
begin
  oldname:=component.Name;
  try
      registerAllClass(Component);
      Component.Name:='CopyOf'+Component.Name;
      MemStream := TMemoryStream.Create;
      try
        MemStream.WriteComponent(Component);
        MemStream.Position := 0;
        result:=MemStream.ReadComponent(nil);
      finally
        MemStream.Free;
      end;
  finally
    Component.Name:=oldname;
  end;
end;

function DuplicateDataset(Dataset:TDataset):TDataset;
var
  oldActive:Boolean;
begin
  if Dataset=nil then
    result:=nil
  else begin
    oldActive:=Dataset.Active;
    try
      Dataset.Active:=false;
      result:=DuplicateComponent(Dataset) as TDataSet;
    finally
      Dataset.Active:=oldActive;
    end;
  end;  
end;

关于delphi - 带有流字段的重复 TADODataSet 组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9474189/

相关文章:

delphi - 写保护 USB 驱动器上出现 ShellExecuteEx 错误?

Delphi - ADODataSet 子集

delphi - 如何检测SQ​​L Server数据库中发生的任何修改?

delphi - 对于 TBitmap,FMX 中是否有相当于 FloodFill 的功能?

regex - 文本文档中的占位符

delphi - 将文本保持在一个圆圈内

multithreading - 线程向主 UI 线程发布消息被阻止/删除

delphi - 在Windows 8和Delphi XE3上使用SQL Server的ADO中,什么会导致“游标操作冲突”错误?

Delphi tcustomcontrol/双控

delphi - 当 Set 由属性提供时,为什么 System.Include 不起作用?