Zapis XML z ADOQuery

BU
  • Rejestracja:ponad 22 lata
  • Ostatnio:3 minuty
  • Postów:297
0

Witam społeczność,
Mam taki kod:

Kopiuj
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  ComObj,
  Data.DB,
  Data.Win.ADODB,
  System.Variants,
  System.DateUtils,
  XMLDoc,
  XMLIntf,
  Xml.xmldom;

var
  config: IXMLDocument;
  sqlsrv, sqluser, sqlpass, sqldb: string;
  query: TADOQuery;
  connStr: string;
  path, sqlquery: string;
  f: TextFile;
  i: integer;
  s: string;
  MainNode: IXMLNode;
  //ds: TDataSet;
begin
  CoInitializeEx(nil, 0);
  config := NewXMLDocument('1.0');
  config.LoadFromFile(ParamStr(1));
  MainNode := config.DocumentElement;
  sqlsrv := MainNode.ChildNodes[0].ChildNodes[0].Text;
  sqluser := MainNode.ChildNodes[0].ChildNodes[2].Text;
  sqlpass := MainNode.ChildNodes[0].ChildNodes[3].Text;
  sqldb := MainNode.ChildNodes[0].ChildNodes[1].Text;
  path := MainNode.ChildNodes[1].ChildNodes[0].Text;
  sqlquery := MainNode.ChildNodes[2].ChildNodes[0].Text;
  connStr := 'Provider=SQLOLEDB.1;Password=' + sqlpass + ';Persist Security Info=True;User ID=' + sqluser + ';Initial Catalog=' + sqldb + ';Data Source=' + sqlsrv;
  query := TADOQuery.Create(nil);
  query.ConnectionString := connStr;
  query.SQL.Text := sqlquery;
  query.Active := True;
  AssignFile(f, path);
  Rewrite(f);
  for i := 0 to query.RecordCount - 1 do
  begin
    s := query.Fields[0].AsString;
    Write(f, s);
    query.Next;
  end;
  CloseFile(f);
end.

W pliku XML mam zapytanie, które kończy się FOR JSON AUTO, ROOT('root')
I wtedy mi wszystko działa. Plik z wynikiem JSON mi się zapisuje i jest ok.
Ale kiedy zmienię na: FOR XML AUTO, ROOT('root'), to wtedy zapisuje mi się totalna sieczka.
Jak to ogarnąć?


Pozdrawiam
Buster
edytowany 1x, ostatnio: Buster
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
0

Spróbuj zmienić FOR XML AUTO na FOR XML RAW.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
BU
  • Rejestracja:ponad 22 lata
  • Ostatnio:3 minuty
  • Postów:297
0

Próbowałem. Również jest sieczka, ale inna.


Pozdrawiam
Buster
PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 12 godzin
  • Postów:3876
0

Co to znaczy sieczka?

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Tuchów
  • Postów:12172
0

@Panczo: zakładam, że kodowanie nie takie jakiego oczekuje i mu krzaki wyświetla.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
BU
  • Rejestracja:ponad 22 lata
  • Ostatnio:3 minuty
  • Postów:297
0

Sieczka, czyli nic podobnego do XML. W pierwszym przypadku w podglądzie same znaki zapytania. A w drugim dane widoczne, ale w jakimś dziwnym formacie.


Pozdrawiam
Buster
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Tuchów
  • Postów:12172
0

Pokaż zrzut ekranu tej sieczki.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
BU
  • Rejestracja:ponad 22 lata
  • Ostatnio:3 minuty
  • Postów:297
0

Teraz, czy jest AUTO, czy RAW wyrzuca mi coś takiego jak w załączniku.


Pozdrawiam
Buster
PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 12 godzin
  • Postów:3876
0

A z ciekawości, jakbyś zwrócił to jako typ xml? Dodaj TYPE do zapytania: select * from tabela FOR XML AUTO, ROOT('root'), TYPE

https://learn.microsoft.com/pl-pl/sql/relational-databases/xml/type-directive-in-for-xml-queries?view=sql-server-ver16

edytowany 1x, ostatnio: Panczo
PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 12 godzin
  • Postów:3876
0

I tak jak mi sie kojarzy to trzeba odebrać jako stream, a nie recordset

Kopiuj
const
  adExecuteStream = 1024;
var
  xmlDoc, RecordsAffected: OleVariant;
  cmd: TADOCommand;

xmlDoc := CreateOleObject('MSXML2.DOMDocument.3.0'); // or CoDomDocument30.Create;
xmlDoc.async := False;

cmd := TADOCommand.Create(nil);    
// specify your connection string
cmd.ConnectionString := 'Provider=SQLOLEDB;Data Source=(local);...';
cmd.CommandType := cmdText;
cmd.CommandText := 'select top 1 * from items for xml auto';
cmd.Properties['Output Stream'].Value := xmlDoc;
cmd.Properties['XML Root'].Value := 'RootNode';
cmd.CommandObject.Execute(RecordsAffected, EmptyParam, adExecuteStream);

xmlDoc.save('d:\test.xml');
cmd.Free;

Nie koduje w delphi ale znalazłem tu: https://stackoverflow.com/questions/40983728/how-to-decode-xml-blob-field-in-d7/40996148#40996148

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.