Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Вниз

Как результат запроса записать в поток?   Найти похожие ветки 

 
h0use   (2003-12-03 16:51) [0]

Уважаемые мастера, не откажите в помощи!
Есть ADODataSet в котором выполняется запрос, как результат запроса записать в поток, так чтоб потом в другом месте этот поток опять перобразовать в данные для Дальнейшей работы, например в DataSource?


 
Johnny Smith   (2003-12-03 17:18) [1]

С помощью Fields.GetData(Buffer: Pointer; NativeFormat: Boolean = True) ты можешь получить в Buffer данные в "сыром" формате. Так, последовательно пройдя по всем полям и записям, ты можешь сбросить все данные в некий буфер, после чего "загнать" его в Stream.


 
h0use   (2003-12-03 17:38) [2]

Извиняюсь за тупой вопрос, а как сделать чтоб буфер складывался в следующем коде:

var
Buf:Pointer
......
for I := 0 to dsADO.RecordCount do // Iterate
begin
GetMem(Buf,dsADO.Fields.Fields[I].DataSize);
dsADO.Fields.Fields[I].GetData(Buf,True);
end;


 
Johnny Smith   (2003-12-03 17:48) [3]

var
Buf:pChar;
Step:integer;
begin
Step:=0;
GetMem(Buf,dsADO.RecordSize*dsADO.RecordCount);
repeat;
for I := 0 to dsADO.Fields.Count-1 do // Iterate
begin
dsADO.Fields.Fields[I].GetData(Buf+Step,True);
Inc(Step,dsADO.Fields.Fields[I].DataSize);
end;
dsADO.Next;
until dsADO.EOF;
end;


 
Семен Сорокин   (2003-12-03 18:12) [4]

2h0use
а чем тебя твой dsADO не устривает в качестве хранилища данных?


 
h0use   (2003-12-04 09:42) [5]

Он меня всем устраивает, кроме одного, что мне его надо пересылать по сетке на клиента, а я работаю с сетью на Инди, они не работают с стандартными компанентами типа TClientDataSet, приходится извращаться и писать свои методы по передачи.


 
Hooch   (2003-12-04 10:02) [6]

а adoDataSet.SaveToFile/LoadFromFile не подойдут ?


 
Polevi   (2003-12-04 11:01) [7]

Socket.SendText(ClientDataset1.XmlData);
ClientDataset1.XmlData:=Socket.ReceiveText;


 
h0use   (2003-12-04 11:10) [8]


> Polevi © (04.12.03 11:01) [7]
> Socket.SendText(ClientDataset1.XmlData);
> ClientDataset1.XmlData:=Socket.ReceiveText;


У меня соединетние НЕ через TSocket, а черз Indy компоненты. Так что данный код однозначно работать не будет!


 
sniknik   (2003-12-04 11:37) [9]

а ты ждеш готовый код? под тебя написанный? ну, ну.
а чего тогда не возмущаешся что ClientDataset1 <> ADODataSet ?

почитай про мидас(для ADO еще и RDS), реально может помочь, и не изобретать велосипед в очередной раз.


 
Polevi   (2003-12-04 11:47) [10]

>h0use © (04.12.03 11:10) [8]
не работал с инди, а что они не умеют посылать-принимать текст ?


 
Johnny Smith   (2003-12-04 11:52) [11]

2Polevi © (04.12.03 11:47) [10]
не работал с инди, а что они не умеют посылать-принимать текст ?
Умеют, умеют :))).
Автор, по всей видимости просто хочет передать некий сырой буфер в сокет. Беда только в том, что его еще надо принять. Я чем-то подобным занимался :)).
Но для простоты я бы посоветовал автору все-таки воспользоваться Вашим предложением с XML-ем.


 
sniknik   (2003-12-04 11:58) [12]

Johnny Smith © (04.12.03 11:52) [11]
> Я чем-то подобным занимался :)).
а не пробовал передавать из ClientDataSet1.Data? это же вроде cds-а (?), более "компактно", xml всетаки перегружен лишней инфой.


 
Johnny Smith   (2003-12-04 12:03) [13]

2sniknik © (04.12.03 11:58) [12]
Я как раз передавал "сырые" данные.


 
Polevi   (2003-12-04 12:19) [14]

не надо сырых данных, xml то что надо, пора уже это осознать, без обид


 
h0use   (2003-12-04 14:10) [15]

Угу...осталось только с этим ClientDataSet разобраться...пример от Борланда до того наворочен и не комментирован, что только путает :(


 
sniknik   (2003-12-04 14:49) [16]

вот это посмотри, пример очень простой (это и по ClientDataSet)
C:\Program Files\Borland\Delphi7\Demos\Midas\AdHoc
мидас именно для передачи данных между машинами.


 
h0use   (2003-12-08 15:41) [17]

непонятки каки-то. Делаю так:

procedure TFM.SQLSelect(AMsg:TCommBlock;AThread: TIdPeerThread);
var
I,Size : Integer;
dsADO : TADODataSet;
AStream: TMemoryStream;
Buf : Pointer;
begin
dsADO:=TADODataSet.Create(Self);
AStream:=TMemoryStream.Create;
try
try
dsADO.Connection:=ADOConn;
dsADO.CommandText:=AMsg.Msg;
dsADO.Open;
dsADO.First;
repeat
for I := 0 to dsADO.Fields.Count-1 do // Iterate
begin
try
Size:=dsADO.Fields.Fields[I].DataSize;
GetMem(Buf,Size);
AStream.WriteBuffer(Size,SizeOf(Integer));
if not dsADO.Fields.Fields[I].GetData(Buf,True) <--- вылетаем на втором цикле
then //AStream.WriteBuffer(0,1)
else AStream.WriteBuffer(Buf,Size);
FreeMem(Buf,Size);
except
on e: Exception do
SaveLog(2,3,"


 
Shirson   (2003-12-08 15:54) [18]

TADOBlobStream не подходит?


 
sniknik   (2003-12-08 16:27) [19]

не знаю по ошибке (молчаливая какаято ошибка непонятная. а самому моделировать ломает ужасно :о))

но вот, какуюто часть глюков отсечеш если замениш
repeat
until dsADO.EOF;
на
while not dsADO.EOF do begin
end;

ну или хотябы втавь перед циклом if dsADO.isEmpty then Exit;
и + (обязательно) блок try except end; делай внутри try finally end; а не наоборот как у тебя. (иначе какой в нем смысл? ошибку скрыть?)


 
h0use   (2003-12-09 17:04) [20]

Сделала так:

procedure TFM.SQLSelect(AMsg:TCommBlock;AThread: TIdPeerThread);
var
I,Size : Integer;
dsADO : TADODataSet;
AStream: TMemoryStream;
Buf : Pointer;
begin
dsADO:=TADODataSet.Create(Self);
AStream:=TMemoryStream.Create;
try
try
dsADO.Connection:=ADOConn;
dsADO.CommandText:=AMsg.Msg;
dsADO.Open;
dsADO.First;
repeat
if dsADO.IsEmpty then Break;
for I := 0 to dsADO.Fields.Count-1 do // Iterate
begin
// AStream.; <---- помечено
(dsADO.Fields.Fields[I] as TMemoField).SaveToStream(AStream);
end;
AStream.WriteBuffer(">>>",3);
dsADO.Next;
until dsADO.EOF;
except
on e: Exception do
SaveLog(2,3,"


 
sniknik   (2003-12-09 17:47) [21]

> Может подскажете, как получить какой тип поля
dsADO.Fields.Fields[I].DataType

repeat
if dsADO.IsEmpty then Break;
...
???
есть же проверка
until dsADO.EOF;
вынеси за цикл

if not dsADO.IsEmpty then
repeat
...
until dsADO.EOF;

зачем каждый раз проверять? лишние тормоза. (совсем от лишних проверок избавится - цикл while do)


 
h0use   (2003-12-09 18:01) [22]

Супер, спасибо, пошел дальше голову ломать...


 
h0use   (2003-12-09 18:04) [23]

Короче не заработал код, опять ничего в поток не пишется...есть еще идею как все же записать Dataset в Stream?


 
sniknik   (2003-12-09 18:26) [24]

> есть еще идею
midas


 
Polevi   (2003-12-09 18:59) [25]

procedure TForm1.Button1Click(Sender: TObject);
var
ds:TADODataset;
rs1,rs2:OleVariant;
ados1,ados2:OleVariant;
xmldata:string;
begin
//запрашиваем данные
ds:=TADODataset.Create(nil);
try
ds.Connection:=DB;
ds.CommandText:="SELECT * FROM Users";
ds.Open;
//сохраняем рекордсет
rs1:=ds.Recordset;
finally
FreeAndNil(ds); //уничтожаем датасет
end;

//создаем объект стрим
ados1:=CreateOleObject("ADODB.Stream");
//сохраняем в него наш рекордсет
rs1.Save(ados1,1);
//получаем данные из потока в виде строки XML
xmldata:=ados1.ReadText;

//xmlData можно передать в другой поток !!!!!!!

//создаем другой объект стрим
ados2:=CreateOleObject("ADODB.Stream");
//открываем его
ados2.Open;
//записываем наши XML данные в стрим
ados2.WriteText(xmlData);
//на начало
ados2.Position:=0;

//создаем рекодсет
rs2:=CreateOleObject("ADODB.Recordset");
//загружаем данные из стрима
rs2.Open(ados2);
//создаем TADODataset
ds:=TADODataset.Create(nil);
//копируем наш рекордесет в него
ds.Recordset:=IUnknown(rs2) as _Recordset;
end;


 
Polevi   (2003-12-09 19:01) [26]

PS
в кодовом потоке должен быть инициализирован COM вызовом CoInitialize(nil)


 
h0use   (2003-12-10 09:44) [27]

Супер! Щас буду пробовать!


 
h0use   (2003-12-10 10:03) [28]


> CoInitialize(nil)

Эту процедуру я не нашел.


 
Polevi   (2003-12-10 10:06) [29]

uses ActiveX;


 
h0use   (2003-12-10 10:09) [30]

при попытке AStream.WriteBuffer(xmldata,Length(xmldata)); вылетает с шаринг виалейшином :(


 
Polevi   (2003-12-10 10:12) [31]

AStream.WriteBuffer(PChar(xmldata)^,Length(xmldata));


 
Polevi   (2003-12-10 10:17) [32]

а вообще данные текстовые - используй TStringStream


 
Polevi   (2003-12-10 10:25) [33]

и вообще видимо я не так понял слово ПОТОК, мне почему то показалось что тебе нужео передать данные в дополнительный КОДОВЫЙ поток - не внимательно прочел. Если дополнительных кодовых потоков у тебя нет - вызов CoInitialize не требуется, если у тебя GUI приложение


 
h0use   (2003-12-10 11:25) [34]

А как прочитать...что-то AStream.ReadBuffer(xmldata,AStream.Size); - не работает, а AStream.ReadBuffer(PChar(xmldata)^,AStream.Size); - вылетает


 
h0use   (2003-12-10 11:27) [35]

Разобрался



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

Форум: "Базы";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.02 c
1-11860
Kremen
2003-12-18 15:50
2004.01.05
Помогите с TWordDocument


1-11947
Кен
2003-12-19 01:58
2004.01.05
Как перетаскивать мышкой элементы по TreeView ?


1-11962
Dr.Alex
2003-12-19 15:33
2004.01.05
Файловая система. HELP!!!


14-12038
Ihor Osov'yak
2003-12-10 23:33
2004.01.05
О покупке книг на http://shop.piter.com из Украины


1-11993
sevgen
2003-12-19 07:18
2004.01.05
Left, Right





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский