Usuário com melhor resposta
ADO.NET Dataset em Delphi Win32

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.
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;- Marcado como Resposta AndreAlvesLimaModerator segunda-feira, 21 de março de 2011 20:47
-
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- Editado Rubem Rocha sexta-feira, 18 de março de 2011 20:44 Texto mal formatado
- Marcado como Resposta AndreAlvesLimaModerator segunda-feira, 21 de março de 2011 20:47
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;- Marcado como Resposta AndreAlvesLimaModerator segunda-feira, 21 de março de 2011 20:47
-
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- Editado Rubem Rocha sexta-feira, 18 de março de 2011 20:44 Texto mal formatado
- Marcado como Resposta AndreAlvesLimaModerator segunda-feira, 21 de março de 2011 20:47