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

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

Как результат запроса записать в поток? [D7, mdb через ADO]


Страницы:   1 2

h0use ©   (2003-12-03 16:51:00) 

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


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

Разобрался


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

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


Polevi   (2003-12-10 10:25:00) [3]

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


Polevi   (2003-12-10 10:17:00) [4]

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


Polevi   (2003-12-10 10:12:00) [5]

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


h0use   (2003-12-10 10:09:00) [6]

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


Polevi   (2003-12-10 10:06:00) [7]

uses ActiveX;


h0use   (2003-12-10 10:03:00) [8]


> CoInitialize(nil)

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


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

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


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

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


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

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;


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

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


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

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


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

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


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

> Может подскажете, как получить какой тип поля
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 17:04:00) [16]

Сделала так:

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-08 16:27:00) [17]

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

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

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


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

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


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

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

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,"


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

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


Страницы:   1 2

Наверх

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