Copying data from ClientDataSet to DBXReader

Let's share the knowledge with your friends

You probably already read my post Copying data from DBXReader to ClientDataSet, now is time to learn how copy data from ClientDataSet to DBXReader using Delphi or C++Builder.

There are many situations where you will need to copy data between ClientDataSet and DBXReader, specially if you are looking to cache data on DataSnap Servers, I’m preparing a new blog post about that and will publish soon.

The DBXDBReaders unit is part of DBX Framework and contain the TDBXDataSetReader class which is a TDBXReader implementation of TDataSet, in other words using this class you will get a DBXReader representation of any DataSet.

You just need to create a instance of TDBXDataSetReader passing the ClientDataSet and the InstanceOwner (true/false). If InstanceOwner is true, the TDataSet instance is freed when the TDBXDataSetReader instance is freed.

Delphi

  
 TDBXDataSetReader.Create(ClientDataSet, False (* InstanceOwner *) )

C++Builder

  
 TDBXDataSetReader->Create(ClientDataSet, False )

TDBXDataSetReader class is compatible with DataSnap 2010 and XE.


Let's share the knowledge with your friends
15 replies
  1. Júlio César Ferreira (@jcmferreira)
    Júlio César Ferreira (@jcmferreira) says:

    Bom dia Andreano!

    O TDBXDataSetReader.Create(ClientDataSet, False (* InstanceOwner *) ) é muito bom mas, está sempre retornando nil quando tento utilizá-lo.

    No meu caso, o ClientDataSet é temporário, via método CreateDataSet.

    Existe alguma coisa a mais para se fazer?
    Obrigado.

    Reply
  2. Júlio César Ferreira (@jcmferreira)
    Júlio César Ferreira (@jcmferreira) says:

    Nenhuma até sair da aplicação servidor, nenhuma exception Andreano. O código que estou tentando é este:

    function TServerModuleEmpresa.GetUserCompanies(idUsuario: Integer; isMaster, isAdmin: Boolean): TDBXReader;

    function CreateCDSEmpresas: TClientDataSet;
    var
    cdsFieldPos: Integer;
    cdsTable: TNewTable;
    begin

    result := TClientDataSet.Create( Self );

    { ... include some fields to result by result.FieldDefs.Add() ... }

    result.CreateDataSet;

    end;

    var
    CDSEmpresas: TClientDataSet;
    begin

    CDSEmpresas := CreateCDSEmpresas;

    builder := GetPreparedBuilder;

    builder.Open;

    while not builder.Dataset.Eof do
    begin

    CDSEmpresas.Append;

    for pos := 0 to builder.Dataset.FieldCount - 1 do
    if CDSEmpresas.FindField( builder.Dataset.Fields[pos].FieldName ) nil then
    CDSEmpresas.FieldByName( builder.Dataset.Fields[pos].FieldName ).Value := builder.Dataset.Fields[pos].Value;

    CDSEmpresas.Post;

    builder.Dataset.Next;

    end;

    { ** Definindo o retorno do método ** }
    result := TDBXDataSetReader.Create( CDSEmpresas, False );

    CDSEmpresas.Free;

    builder.Destroy( True );

    end;

    Reply
    • Andreano Lanusse
      Andreano Lanusse says:

      @Julio, eu não sei o que o método builder.destroy está fazendo, suponho que você esteja destruindo algo que não deveria até que a informação seja enviada, veja os exemplos que disponibilizei de DataSnap

      Reply
  3. Júlio César Ferreira (@jcmferreira)
    Júlio César Ferreira (@jcmferreira) says:

    Entendi @Andreano mas não se preocupe…

    Quando o código chega nesta linha abaixo, o conteúdo de CDSEmpresas está definido de forma correta…

    result := TDBXDataSetReader.Create( CDSEmpresas, False );

    A linha builder.destroy é referente a minha classe de consultas ao banco de dados e não possui ligação com o ClientDataSet.

    Não sei se ajudaria mas, nesse fórum tenho todo o código do servidor e do cliente para vc entender melhor: http://www.activedelphi.com.br/forum/viewtopic.php?p=366776#366776

    Reply
  4. Júlio César Ferreira (@jcmferreira)
    Júlio César Ferreira (@jcmferreira) says:

    Apenas para testes, reduzi toda a implementação do método para oq está abaixo. Mas continua dando o mesmo problema:

    function TServerModuleEmpresa.GetUserCompanies(idUsuario: Integer; isMaster, isAdmin: Boolean): TDBXReader;
    begin

    CDSEmpresas := CreateCDSEmpresas;

    // CDSEmpresas é um TClientDataSet com 4 registros...

    result := TDBXDataSetReader.Create( CDSEmpresas, False );

    end;

    result sempre retorna (nil,nil)

    Reply
  5. Júlio César Ferreira (@jcmferreira)
    Júlio César Ferreira (@jcmferreira) says:

    Desculpe Andreano.

    A solução simplesmente não funciona! Executei um projeto novo com nada além do código para criar o DBXReader e mesmo assim, sempre retorna (nil,nil)

    Não sei se existe alguma influência mas, minha versão é a Embarcadero® Delphi® XE Version 15.0.3890.34076.

    Reply
  6. Júlio César Ferreira (@jcmferreira)
    Júlio César Ferreira (@jcmferreira) says:

    BOA NOVA!

    No novo projeto criado, realizei outro teste e dessa vez funcionou! Houve confusão da minha parte na determinação do CopyReaderToClientDataSet e ToClientDataSet.

    O Delphi, porém, sempre exibe o resultado do TDBXDataSetReader.Create como (nil,nil), oq gera alguma confusão na hora de realizar o debug da implementação.

    Obrigado pela força.
    Solução funcionando!

    Reply
  7. Jofan
    Jofan says:

    Boas, Andreano
    Acompanho os seus post e relativamente, à conversão DBXReader para ClientDataSet, no delphi XE3 não funciona?!!!!
    TDBXDataSetReader.CopyReaderToClientDataSet, metodo não existe!
    Pode me ajudar?
    Obrigado

    Reply
  8. Rômulo
    Rômulo says:

    Boa noite. Estou fazendo alguns testes utilizado o delphi XE3. Fiz um método que retorna um conjuntos de dados TDBXReader. No lado cliente preciso exibir esses dados num grid. Li que existe um método chamado CopyReaderToDataSet que faz a copia da estrutura/dados para um dataSet, mas não encontrei esse método no delphi XE3. Tenho o Delphi 2010 onde nele aparece. Alguém sabe dizer se ele foi retirado?

    Reply

Trackbacks & Pingbacks

  1. […] ClientDataSet and vice-versa using dbxExpress framework, you probably already read some of my blog posts where I explain how it works in desktop applications, however in mobile platforms we don’t […]

  2. […] This post was mentioned on Twitter by Andreano Lanusse, Adriano Santos. Adriano Santos said: RT @andreanolanusse: New blog post: Copying data from ClientDataSet to DBXReader http://bit.ly/hapW9E […]

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.