Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.24;
Скачать: CL | DM;

Вниз

Как получить результат выполнения процедуры в формате XML   Найти похожие ветки 

 
BACEK ©   (2002-05-29 15:51) [0]

Необходимо в Delphi 5 с использованием ADO получить результат работы хранимой процедуры из MSSQL, результаты представлены в формате XML.


 
Дмитрий Баранов   (2002-05-29 16:51) [1]

1) AdoQuery.SaveToFile("...xml");
2) FOR XML CLAUSE в Books online (подробностей не знаю, почитаете)
3) (imho самое удобное) - самому написать хранимую процедуру-конвертер


 
BACEK ©   (2002-05-29 17:11) [2]

На данный момент задача сводиться к считыванию результата выполнения хранимой процедуры, которая возвращает необходимую информацию в формате XML. СЧИТАТЬ данные из ADOCommand в текстовую переменную вот в чем проблема !!!


 
Дмитрий Баранов   (2002-05-29 17:17) [3]

Тэкс,
1) AdoCommand или AdoStoredProc? Я вот только что поэкспериментировал со вторым - все чудесно в DBMemo вывелось
2) Может, абраказябры выводит? Так это UTF...


 
BACEK ©   (2002-05-29 17:50) [4]

Кинь пример


 
BACEK ©   (2002-05-29 18:37) [5]

И как перекодировать данные полученные в UTF в нормальный вид.


 
Дмитрий Баранов   (2002-05-29 18:44) [6]

Чего-то я пальцы растопырил - тысячу извинений :))
Поэкспериментировал с FOR XML - получается рекордсет с BLOB-полями. Теоретически можно сохранить это дело в MemoryStream, потом привести к WideChar, только хрен его знает, включается ли в этот stream Unicode byte-order mark (FEFF). Щас поковыряюсь...


 
Дмитрий Баранов   (2002-05-29 21:35) [7]

Перевод с VB -
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q272269


procedure TForm1.Button1Click(Sender: TObject);
var
adoCmd,
adoConn,
adoStreamQuery,
outStrm,
txtResults,
CmdStream: OleVariant;
sConn: WideString;
sQuery: WideString;
Str: WideString;
Dummy: integer;
begin
sConn := "Provider=SQLOLEDB.1;Password=...;Persist Security Info=True;User ID=..;Initial Catalog=...;Data Source=BANKOSERV";

adoConn := CreateOleObject("ADODB.Connection");
adoStreamQuery := CreateOleObject("ADODB.Stream");

adoConn.ConnectionString := sConn;
adoConn.Open;

adoCmd := CreateOleObject("ADODB.Command") ;
adoCmd.ActiveConnection := adoConn;

sQuery := "<ROOT xmlns:sql=""urn:schemas-microsoft-com:xml-sql"">";
sQuery := sQuery + "<sql:query>SELECT top 100 * FROM company FOR XML AUTO</sql:query>";
sQuery := sQuery + "</ROOT>";

adoStreamQuery.Open;
adoStreamQuery.WriteText(sQuery, adWriteChar);
adoStreamQuery.Position := 0; //" Reset the position in the stream, otherwise it will be at EOS

adoCmd.CommandStream := adoStreamQuery; // " Set the command object"s command to the input stream set above
adoCmd.Dialect := "{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"; //Set the dialect for the command stream to be a SQL query.
outStrm := CreateOleObject("ADODB.Stream");
outStrm.Open;
adoCmd.Properties["Output Stream"] := outStrm;
adoCmd.Execute(Dummy, 0, adExecuteStream);
outStrm.SaveToFile("C:\test.txt");
end;

Ну вот, кроме SaveToFile у ADODB.Stream есть методы Write и WriteText. Правда, сохраняется один хрен - в UTF-8, чего с ним делать - так с лету не скажу...


 
Дмитрий Баранов   (2002-05-29 21:41) [8]

Ну все, лови :))
...
outStrm.Open;
adoCmd.Properties["Output Stream"] := outStrm;
adoCmd.Execute(Dummy, 0, adExecuteStream);
//outStrm.SaveToFile("C:\test.txt");
STR:=outStrm.ReadText(outStrm.size);
ShowMessage(STR);


 
BACEK ©   (2002-05-30 09:28) [9]

Дим огромное спасибо - вроде получяется. Буду дальше разбираться. Надо еще схему подключить.


 
Дмитрий Баранов   (2002-05-30 12:00) [10]

Да не за что, только надо еще OleVariant`ы к чертям - импортируй библиотеку типов ADO 2.7.


 
BACEK ©   (2002-05-30 14:29) [11]

type_library -> создать юнит -> прописать его в uses

А потом как его использовать? Подскажи напримере следующего кода:

adoConn := CreateOleObject("ADODB.Connection");
adoStreamQuery := CreateOleObject("ADODB.Stream");
adoConn.ConnectionString := sConn;
adoConn.Open;
adoCmd := CreateOleObject("ADODB.Command") ;
adoCmd.ActiveConnection := adoConn;

как это выглядеть будет если использовать библиотеку типов ADO 2.7?


 
Дмитрий Баранов   (2002-05-30 21:47) [12]

procedure TForm1.Button1Click(Sender: TObject);
var Dummy: OleVariant;
rs: _Recordset;
X: WideString;
begin
cnn.Open( // cnn - TConnection из type library
"Provider=SQLOLEDB.1;Password=1;Persist Security Info=True;User ID=sa;Initial Catalog=Northwind;Data Source=IT01",
"sa",
"1",
0);
rs:=cnn.Execute("select top 100 * from Employees for XML AUTO", Dummy, adCmdText);
rs.Save(Stream1.DefaultInterface, adPersistXML);
X:=Stream1.ReadText(Stream1.Size);
Memo1.Lines.Text:=X;
end;


 
Дмитрий Баранов   (2002-05-31 00:27) [13]

... это - как НЕ надо делать :))
(надеюсь, что эту ветку в потрепаться - не перенесут)
тогда уж импортируй и MSXML

var rs: _Recordset;
Qr: WideString;
D : OleVariant;
Doc: IXMLDOMDocument2;
CoDoc: CoDomDocument;
begin
Doc:=CoDoc.Create;
cnn.Open( // cnn - TConnection из type library
"Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initial Catalog=Northwind;Data Source=IT01",
"sa",
"1",
0);
Qr:="select * from employees";
rs := cnn.Execute(QR, D, adCmdText);
rs.Save(Doc, adPersistXML);
Memo1.Lines.Text:=Doc.xml;
end;



Страницы: 1 вся ветка

Текущий архив: 2002.06.24;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
7-77622
Ff
2002-03-27 09:10
2002.06.24
Как программно отформатировать логический диск?


7-77637
UnDISCOvery
2002-03-12 15:50
2002.06.24
Как программно изменить состояние флага


14-77608
MisterBin
2002-05-16 21:24
2002.06.24
Кто какую музыку слушает когда пишет программу?


7-77649
Antalex
2002-03-28 19:54
2002.06.24
В TurboPaskal при подключении CRT ошибка деления на 0


14-77547
fliz
2002-05-18 12:52
2002.06.24
народ, что в мире происходит ?