![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как результат запроса записать в поток? [D7, mdb через ADO]
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
мидас именно для передачи данных между машинами.