Форум: "Базы";
Текущий архив: 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