Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ADO в XML [D6, MSSQL]


Юрий Сидоров ©   (2002-06-21 05:29:00) 

Здравствуйте !

Мне надо вывести ADO DataSet в XML поток. Делаю следующее:
FConnection.DefaultInterface.CursorLocation := adUseClient;
FStream := TFileStream.Create("skladsf.xml", fmCreate);
FStreamAdapter := TStreamAdapter.Create(FStream, soOwned);
FConnection.Open("Provider=SQLOLEDB;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Pv;Data Source=SERVER", "", "", 0);
FCommand.DefaultInterface.Set_ActiveConnection(FConnection.DefaultInterface);
FCommand.DefaultInterface.CommandType := adCmdText;
FCommand.DefaultInterface.CommandText := "select Ident, Name from Sklads order by Ident";
FCommand.DefaultInterface.Properties["Output Stream"].Value := FStreamAdapter as IStream;
Parameters := Null;
FCommand.DefaultInterface.Execute(RecordsAffected, Parameters, adExecuteStream);


Получаю ошибку:
"Streaming not supported over multiple column result"

Подскажите, как сделать правильно. Спасибо.


kig   (2002-06-21 13:10:00) [1]

Вообще-то

r.MoveLast ;

можно пропустить...


kig   (2002-06-21 12:53:00) [2]

А зачем такие навороты при сохранении в поток?

Так не проще?


uses
ComObj, ADODB_TLB;

procedure TForm1.Button1Click(Sender: TObject);
var
r: Recordset;
s: Stream;
begin
r := CreateComObject(CLASS_Recordset) as Recordset;
r.CursorLocation := adUseClient;
r.Open("select * from Customers",
"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=BLADE",
adOpenKeyset, adLockReadOnly, -1);
r.MoveLast ;
s := CreateComObject(CLASS_Stream) as Stream;
(r as _Recordset).Save(s, adPersistXML);
s.Position := 0;
Memo1.Text := s.ReadText(adReadAll);
end;


Fiend   (2002-06-21 11:09:00) [3]

Даю фишку от Дмитрия Баранова, ему кстати ОТДЕЛЬНОЕ СПАСИБО отменя за помощь в этой же проблемме.


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=banko;Data Source=;

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

adoConn.ConnectionString := sConn;
adoConn.Open;

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

sQuery := "";
sQuery := sQuery + "SELECT top 100 * FROM company FOR XML AUTO";
sQuery := sQuery + "";

adoStreamQuery.Open;
adoStreamQuery.WriteText(sQuery, adWriteChar);
adoStreamQuery.Position := 0;
adoCmd.CommandStream := adoStreamQuery; // " Set the command object"s command to the input stream set above
adoCmd.Dialect := "{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"; .
outStrm := CreateOleObject("ADODB.Stream");
outStrm.Open;
adoCmd.Properties["Output Stream"] := outStrm;
adoCmd.Execute(Dummy, 0, adExecuteStream);
STR:=outStrm.ReadText(outStrm.size);
ShowMessage(STR);
end;


Тут все просто. В общих словах - ADORecordset можно сохранить в ADO.Stream или IXMLDomDocument
См здесь
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1022673091&n=1

С уважением,
Дмитрий Баранов
void@tourdom.ru


Дмитрий Баранов   (2002-06-21 10:47:00) [4]

Пропал раздел куда-то, еще полчаса назад был... В двух словах - после импорта библиотеки типов ADO работать надо не с компонентами ADOExpress, а с родными MS-интерфесами. У ADO.Recordset есть метод Save, можно сохранить его в формате XML в ADO.Stream или в XMLDOMDocument.


AlexanderVasjuk   (2002-06-21 10:41:00) [5]

Пардон
ADODataSet1.SaveToStream...


alexandervasjuk   (2002-06-21 10:36:00) [6]

почему бы не
ADODataSet1.SaveToFile("skladsf.xml", pfXML);


Дмитрий Баранов   (2002-06-21 10:28:00) [7]

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1022673091&n=1
( уже раз четвертый ссылку даю, наверное :)


Юрий Сидоров   (2002-06-21 10:02:00) [8]

Да.
Так работает, но хотелось изящней,
не возиться с временными именами файлов и др.
Дело в том, что это будет работать как сервис, в многопоточном режиме.


Dok_3D   (2002-06-21 07:50:00) [9]

Слушай, я не знаю, зачем тебе XML в поток нужно загнать,
но ты не пробовал так:

ADODataSet1.SaveToFile("skladsf.xml", pfXML);
FStream := TFileStream.Create("skladsf.xml", fmRead);
// Сейчас твой XML в потоке
FStream.Free;


Наверх

Титульная страница Поиск, карта сайта Написать письмо