none
ADO.NET Dataset em Delphi Win32 RRS feed

  • Pergunta

  • Tenho um Webservice C# que gera para mim um XML, porem quando tento ler em Delphi para carregar no Delphi não consigo. Ja vi nesse forum que foi feita uma rotina que transforma no formato certo. Se alguem puder me ajudar, agradeço desde já.

     

    Abraços.

    quinta-feira, 3 de abril de 2008 13:41

Respostas

  • Olá.

    Você não é o único com esse problema e está ficando comum esse tipo de situação. Já recebi vários emails sobre essa questão.

    Bom.

    Peço desculpas antecipadamente aos moderadores.

    Colocarei aqui um código em Delphi.Net solucionando o problema, que poderá ser facilmente migrado a outra linguagem .Net.

    Se em caso algum problema, por favor, não é com má intensão e sim pra ajudar o colegas da área.

    Lembrando que os creditos não são só meus. Absorvi esse conhecimento através de um artigo de Guinther Pauli.

    Segue o código abaixo.

     

    function DataSetToMidas(dst: DataSet): XmlDocument;
    var
      writer: XmlTextWriter;
      memory: MemoryStream;
      column: DataColumn;
      cltype: String;
      clname: String;
      dtrow:  DataRow;
      xml:    XmlDocument;
      str:    String;
    begin
      {Cria objeto em memória}
      memory:=MemoryStream.Create;
      {Cria objeto para escrita xml em memória}
      writer:=XmlTextWriter.Create(memory,System.Text.ASCIIEncoding.Create);
      {formatacao do xml}
      writer.Formatting   :=Formatting.Indented;
      writer.Indentation  :=4;
      with writer do
      begin
        {Inicio da escrita xml e suas tags}
        WriteStartDocument(True);
        WriteStartElement('DATAPACKET');
        WriteAttributeString('Version','2.0');
        WriteStartElement('METADATA');
        WriteStartElement('FIELDS');
        {Loop para identificar as Colunas e os tipos de dados para gerar os tipo compativeis com ClientDataSet}
        for column in dst.Tables[0].Columns do
        begin
          WriteStartElement('FIELD');
          WriteAttributeString('attrname',column.ColumnName);

          if column.DataType.ToString='System.String' then
             cltype:='string';

          if column.DataType.ToString='System.Int32' then
             cltype:='i4';

          WriteAttributeString('fieldtype',cltype);

          if cltype='string' then
             WriteAttributeString('WIDTH','255');

          WriteEndElement;
        end;
        WriteEndElement;
        WriteStartElement('PARAMS');
        WriteAttributeString('DEFAULT_ORDER','1');
        WriteAttributeString('PRIMARY_KEY','1');
        WriteEndElement;
        WriteEndElement;
        WriteStartElement('ROWDATA');
        {Loop para a escrita dos dados no xml com as tags compativeis com ClientDataSet}
        for dtrow in dst.Tables[0].Rows do
        begin
          WriteStartElement('ROW');
          for column in dst.Tables[0].Columns do
          begin
            clname:=column.ColumnName;
            WriteAttributeString(clname,dtrow[clname].ToString);
          end;
          WriteEndElement;
        end;
        WriteEndElement;
        WriteEndDocument;
      end;
      {Finaliza a escrita xml}
      writer.Close;
      {Retorna o xml que está em memória}
      str:=Encoding.UTF8.GetString(memory.ToArray);
      {Retorna o xml definido para a aplicação solitante}
      xml:=XmlDocument.Create;
      xml.LoadXml(str);
      Result:=xml;
    end;

     

    function SelecionarDados: XmlDocument;
    var
      cmd: SqlCommand;
      con: SqlConnection;
      dap: SqlDataAdapter;
      dst: DataSet;
    begin
      try
        {Cria objeto de conexao}
        con:= SqlConnection.Create(ConfigurationSettings.AppSettings['Conexao']);
        {Abri Conexao}
        con.Open;
        {Cria obejto de comandos}
        cmd:= SqlCommand.Create;
        with cmd do
        begin
          {Seta a conexao e a sql usada no comando}
          Connection  :=con;
          CommandText :='Select * From MinhaTabela';
        end;
        try
          {Cria obejto de vinculo da aplicaçao com banco de dados}
          dap:= SqlDataAdapter.Create(cmd);
          {Cria objeto DataSet}
          dst:= DataSet.Create;
          {Retorno dos dados da sql}
          dap.Fill(dst, 'MinhaTabela');
          {Retornará o XML compativel com ClientDataSet}
          Result:=DataSetToMidas(dst);
        finally
          {Fecha a conexao}
          con.Close;
        end;
      except
        {Em caso de erro anula o retorno}
        Result := nil;
        raise;
      end;
    end;

    quinta-feira, 3 de abril de 2008 18:46
  • Usando DataSets do ADO.NET em Delphi

    http://www.agnisoft.com/soap/dotnetsoap.htm

    Este artigo mostra como usar datasets do ADO.NET, retornados por webservices feitos em .NET, em aplicações Delphi.


    Sds.,

    Rubem Rocha
    MCPD ASP.NET
    Manaus - AM
    sexta-feira, 18 de março de 2011 20:43

Todas as Respostas

  • Olá.

    Você não é o único com esse problema e está ficando comum esse tipo de situação. Já recebi vários emails sobre essa questão.

    Bom.

    Peço desculpas antecipadamente aos moderadores.

    Colocarei aqui um código em Delphi.Net solucionando o problema, que poderá ser facilmente migrado a outra linguagem .Net.

    Se em caso algum problema, por favor, não é com má intensão e sim pra ajudar o colegas da área.

    Lembrando que os creditos não são só meus. Absorvi esse conhecimento através de um artigo de Guinther Pauli.

    Segue o código abaixo.

     

    function DataSetToMidas(dst: DataSet): XmlDocument;
    var
      writer: XmlTextWriter;
      memory: MemoryStream;
      column: DataColumn;
      cltype: String;
      clname: String;
      dtrow:  DataRow;
      xml:    XmlDocument;
      str:    String;
    begin
      {Cria objeto em memória}
      memory:=MemoryStream.Create;
      {Cria objeto para escrita xml em memória}
      writer:=XmlTextWriter.Create(memory,System.Text.ASCIIEncoding.Create);
      {formatacao do xml}
      writer.Formatting   :=Formatting.Indented;
      writer.Indentation  :=4;
      with writer do
      begin
        {Inicio da escrita xml e suas tags}
        WriteStartDocument(True);
        WriteStartElement('DATAPACKET');
        WriteAttributeString('Version','2.0');
        WriteStartElement('METADATA');
        WriteStartElement('FIELDS');
        {Loop para identificar as Colunas e os tipos de dados para gerar os tipo compativeis com ClientDataSet}
        for column in dst.Tables[0].Columns do
        begin
          WriteStartElement('FIELD');
          WriteAttributeString('attrname',column.ColumnName);

          if column.DataType.ToString='System.String' then
             cltype:='string';

          if column.DataType.ToString='System.Int32' then
             cltype:='i4';

          WriteAttributeString('fieldtype',cltype);

          if cltype='string' then
             WriteAttributeString('WIDTH','255');

          WriteEndElement;
        end;
        WriteEndElement;
        WriteStartElement('PARAMS');
        WriteAttributeString('DEFAULT_ORDER','1');
        WriteAttributeString('PRIMARY_KEY','1');
        WriteEndElement;
        WriteEndElement;
        WriteStartElement('ROWDATA');
        {Loop para a escrita dos dados no xml com as tags compativeis com ClientDataSet}
        for dtrow in dst.Tables[0].Rows do
        begin
          WriteStartElement('ROW');
          for column in dst.Tables[0].Columns do
          begin
            clname:=column.ColumnName;
            WriteAttributeString(clname,dtrow[clname].ToString);
          end;
          WriteEndElement;
        end;
        WriteEndElement;
        WriteEndDocument;
      end;
      {Finaliza a escrita xml}
      writer.Close;
      {Retorna o xml que está em memória}
      str:=Encoding.UTF8.GetString(memory.ToArray);
      {Retorna o xml definido para a aplicação solitante}
      xml:=XmlDocument.Create;
      xml.LoadXml(str);
      Result:=xml;
    end;

     

    function SelecionarDados: XmlDocument;
    var
      cmd: SqlCommand;
      con: SqlConnection;
      dap: SqlDataAdapter;
      dst: DataSet;
    begin
      try
        {Cria objeto de conexao}
        con:= SqlConnection.Create(ConfigurationSettings.AppSettings['Conexao']);
        {Abri Conexao}
        con.Open;
        {Cria obejto de comandos}
        cmd:= SqlCommand.Create;
        with cmd do
        begin
          {Seta a conexao e a sql usada no comando}
          Connection  :=con;
          CommandText :='Select * From MinhaTabela';
        end;
        try
          {Cria obejto de vinculo da aplicaçao com banco de dados}
          dap:= SqlDataAdapter.Create(cmd);
          {Cria objeto DataSet}
          dst:= DataSet.Create;
          {Retorno dos dados da sql}
          dap.Fill(dst, 'MinhaTabela');
          {Retornará o XML compativel com ClientDataSet}
          Result:=DataSetToMidas(dst);
        finally
          {Fecha a conexao}
          con.Close;
        end;
      except
        {Em caso de erro anula o retorno}
        Result := nil;
        raise;
      end;
    end;

    quinta-feira, 3 de abril de 2008 18:46
  • Usando DataSets do ADO.NET em Delphi

    http://www.agnisoft.com/soap/dotnetsoap.htm

    Este artigo mostra como usar datasets do ADO.NET, retornados por webservices feitos em .NET, em aplicações Delphi.


    Sds.,

    Rubem Rocha
    MCPD ASP.NET
    Manaus - AM
    sexta-feira, 18 de março de 2011 20:43