15 responses

  1. Júlio César Ferreira (@jcmferreira)
    25 de outubro de 2011

    Bom código mas, a implementação não funciona!

    Uma cópia exata do código descrito acima para tentar publicar uma classe TUsuario que possui um objeto TDataSetProvider e que precisa ser exposto.

    Na aplicação cliente, quando é tentado referenciar o ProviderName do componente TClientDataSet, dá erro de “Invalid class typecast”

    • Andreano Lanusse
      25 de outubro de 2011

      @Júlio,

      O código está correto e funciona perfeitamente quando o DataModule tem providers.

      No seu caso você está tentando passar um provider em uma classe, TDataSetProvider não é suportado para passar. Você neste caso tem que usar o TDataSetProvider no datamodule.

      Aproveitando atualizei a implementação do exemplo neste post

  2. Júlio César Ferreira (@jcmferreira)
    26 de outubro de 2011

    Andreano,

    Pelo que entendi então, somente poderei disponibilizar um TDataSetProvider se ele estiver dentro de um TDataModule?
    Neste caso, sou obrigado a herdar sempre de um TDataModule ou dos seus descendentes?
    Existe algum meio para fazer isso de uma classe normal, herdando de TPersistent por exemplo?

  3. Andreano Lanusse
    26 de outubro de 2011

    Julio,

    É só mudar o código e não chegar a herança, o código está assim porque esta é a forma que o DataSnap recomenda e caso você queira expor provider a classe checa se realmente existe um Datamodule associado.

    Eu não tenho detalhes do que você está desenvolvendo, mas DataModule para situações de provider é o melhor caminho

  4. Júlio César Ferreira (@jcmferreira)
    26 de outubro de 2011

    Tudo bem Andreano! Já entendi o esquema…

    Mas, fazendo uma pergunta extra: Tentei criar um TSQLConnection em runtime para realizar a conexão DataSnap com a aplicação servidor mas, sempre dá o erro:

    TDBXError with message ‘Unknown driver: DataSnap’

    Existe alguma dica pra funcionar?

  5. Andreano Lanusse
    26 de outubro de 2011

    Este erro pode estar relacionado com várias coisas, comece declarando a unit DbxDatasnap no seu código

  6. Júlio César Ferreira (@jcmferreira)
    26 de outubro de 2011

    Em cheio! Resolvido. =))

  7. Tiago
    9 de novembro de 2011

    Fazendo uns testes, onde queria expor uma classe herdade de TProviderDataModule. Porém, não executa o método Constructor Create, onde faço a implementação da criação de meu TDataSetProvider e do TSQLDataSet.


    {$METHODINFO ON}
    TCustomServerClass = Class(TProviderDataModule)
    Published
    DSProvider:TDataSetProvider;
    SQLDataSet:TSQLDataSet;
    Public
    Constructor Create(AOwner:TComponent); Override;
    Destructor Destroy(); Override;
    End;
    {$METHODINFO OFF}

    Constructor TCustomServerClass.Create(AOwner:TComponent);
    Begin
    Inherited;
    DSProvider := TDataSetProvider.Create(Self);
    SQLDataSet := TSQLDataSet.Create(Self);
    DSProvider.DataSet := SQLDataSet;
    SQLDataSet.SQLConnection := UntDMServer.DMServer.SQLConnectServer;
    SQLDataSet.CommandType := ctQuery;
    End;

    Tem algo que eu possa implementar para executar o método Constructor Create ?
    Grato!

  8. Rafael Pasa
    24 de novembro de 2011

    Existe uma tecnica parecida para publicar os serverClass num DataSnap Rest Application?

    • Andreano Lanusse
      25 de novembro de 2011

      Rafael é só usar o mesmo código

  9. davi
    4 de janeiro de 2012

    Andreano, desculpe minha ignorância mas apesar de usar o delphi desde a versão 4, só estou entrando para o mundo do datasnap agora, até então usava servidores baseados na tecnologia com com o remotedatamodule.

    To com uma aplicação onde o server tem uma classe X que é de um tdatamodule, na unit uServerContainer tenho um DSServerClass que retorna a classe X, no lado client o dbconnection conecta normalmente ao servidor quando o mesmo está rodando, contudo mesmo configurando o dsproviderconnection com a classe X não consigo visualizar o provider do lado servidor. O seu artigo parece tratar sobre isso, mas não entendi onde exatamente faço a alteração do código? Esta classe TSimpleServerClass seria a minha classe X??? algum fonte exemplo simples pra me indicar? grato!

    • Andreano Lanusse
      11 de janeiro de 2012

      Davi,

      No create to simpleserverclass tem um parâmetro chamado ExposeProvider, este tem que estar True para que o cliente veja os providers

  10. Denis
    23 de abril de 2012

    Andreano, gostaria de saber se tem como fazer algo semelhante ao que foi feito aqui, porém na parte cliente. Porque chamar aquela opção do SQLConnection de “generate datasnap client classes” e ele gerar um única unit enorme com tudo publicado é dureza para o trabalho em equipe. Seria ideal ter units menores correspondentes a cada TServerModule. O que você acha?

  11. Rodrigo cesr
    23 de janeiro de 2014

    Olá, não entendi onde devo chamar a procedure RegisterServerClasses(AOwner: TComponent; AServer: TDSServer);, estou utilizando Datasnap Rest, e queria disponibilizar os providers contidos em um TDSServerModule na minha aplicação. obrigado

Leave a Reply

 

 

 

Back to top
mobile desktop