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

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

Сохранение ADODataSet в поток - данные не сохраняются?


Страницы:   1 2

sergch ©   (2004-09-09 10:52:00) 

Вот, попытался сохранить компонент TADODataSet в поток

var
 Stream: TMemoryStream;
begin
 Stream := TMemoryStream.Create;
 Stream.WriteComponent(ADODataSet1);
 Stream.SaveToFile('c:\1.txt');

Вот результат сохранения

TPF0\xBTADODataSet\xBADODataSet1
CursorType\x7\x8ctStatic\x8LockType\x7\x11ltBatchOptimistic
Parameters\xE

Однако данные не сохранились. Подскажите, может кто знает как сохранить данные?


Digitman   (2004-09-09 14:08:00) [1]


> sergch   (09.09.04 12:05) [14]
> Данные ADODataSet - это данные, которые добавляет, редактирует
> и удаляет пользователь, и при сохранении формы как компонента,
> эти данные сохраняются.


нет, не сохраняются ... да и не могут сохраняться, потому что компонент этот изначально не создавался как компонент, способный работать с НД в "офф-лайн" (в отличие, например, от TClientDataset)

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


Delirium   (2004-09-09 13:01:00) [2]

"А есть какая нибудь дока " - разумеется есть!
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmscadoapireference.asp?frame=true
Только не спрашивай "а есть-ли на русском" :)

"и насколько реально записывать данные TADODataSet с помощью Stream.WriteComponent(Form1);" - "данные" в твоём понимании не реально вообще, значения свойств компонент и содержимое COM-объекта 'ADODB.RecordSet' - совсем разные вещи.


sergch   (2004-09-09 12:49:00) [3]

Да! всё работает.

А есть какая нибудь дока по использованию OLE ADODB.
и насколько реально записывать данные TADODataSet с помощью Stream.WriteComponent(Form1);

Благодарю за помощь.


Delirium   (2004-09-09 12:40:00) [4]

AccessViolation говорит о том, что у TADODataSet отсутствует _RecordSet, а из этого следует, что компонент не содержит "данных" вообще. Что-то ты путаешь, проверь ещё раз.


sergch   (2004-09-09 12:35:00) [5]

DataSet - активный

и всё равно выскакивает ошибка EAccessViolation на строке

 Variant(FADODataSet.Recordset).Save(adoStream, adPersistXML);


Delirium   (2004-09-09 12:25:00) [6]

Писал "в слепую", только что проверил, вот 100% работающий код:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, DB, ADODB, ADOInt, ComObj;

type
 TForm1 = class(TForm)
   Button1: TButton;
   ADOQuery1: TADOQuery;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

function ADODataSetToMemoryStream(FADODataSet:TADODataSet):TMemoryStream;
var adoStream:OleVariant;
  St:TStrings;
begin
adoStream:=CreateOLEObject('ADODB.Stream');
Variant(FADODataSet.Recordset).Save(adoStream, adPersistXML);
St:=TStringList.Create;
St.Text:=adoStream.ReadText(adoStream.Size);
result:=TMemoryStream.Create;
St.SaveToStream(result);
result.Position:=0;
St.Free;
adoStream:=UnAssigned;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.LoadFromStream(ADODataSetToMemoryStream(TADODataSet(ADOQuery1)));
end;

end.

Единсвенное дополнение в функцию - выделено


Delirium   (2004-09-09 12:22:00) [7]

"Выскакивает ошибка EAccessViolation " DataSet-то у тебя активный ?


sergch   (2004-09-09 12:15:00) [8]

>>Это-же пример, а не готовый код, хочешь чтобы за тебя написали

1.Ругается на adoStream:=UnAssigned; пришлось добавить в uses Variants

2.На Variant(FADODataSet.Recordset).Save(adoStream, adPersistXML);
Выскакивает ошибка EAccessViolation

Delphi6


sergch   (2004-09-09 12:05:00) [9]

>>ты вообще-то о каких "данных" речь ведешь ?

Данные ADODataSet - это данные, которые добавляет, редактирует и удаляет пользователь, и при сохранении формы как компонента, эти данные сохраняются.


Delirium   (2004-09-09 12:01:00) [10]

Это-же пример, а не готовый код, хочешь чтобы за тебя написали всё? Изволь..
uses Classes, ComObj, ADODB, ADOInt;

function ADODataSetToMemoryStream(FADODataSet:TADODataSet):TMemoryStream;
var adoStream:OleVariant;
   St:TStrings;
begin
adoStream:=CreateOLEObject('ADODB.Stream');
Variant(FADODataSet.Recordset).Save(adoStream, adPersistXML);
St:=TStringList.Create;
St.Text:=adoStream.ReadText(adoStream.Size);
result:=TMemoryStream.Create;
St.SaveToStream(result);
St.Free;
adoStream:=UnAssigned;
end;


Найди 10 отличий :)


Digitman   (2004-09-09 11:55:00) [11]


> кроме всего почего, находим там данные


ты вообще-то о каких "данных" речь ведешь ?


sergch   (2004-09-09 11:54:00) [12]

procedure TStreamDirector.AddFromRecordSet(AName:String; ARecordSet:_RecordSet);

а зачем нам AName:String;?


Delirium   (2004-09-09 11:51:00) [13]

В посте [8] что не понятно?


sergch   (2004-09-09 11:48:00) [14]

Когда я делаю так

var
Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create;
Stream.WriteComponent(Form1);
Stream.SaveToFile('c:\1.txt');

то кроме всего почего, находим там данные

(\x4Data
™   •   –\x19аЅ\x1   \x18   \x2 \x3   \x3   ѓ \x3Key\x1 I   \x1 \x5WIDTH\x2 \x2 \x1F \x5Value\x1 I   \x1 \x5WIDTH\x2 \x2 \x1F \x1
CHANGE_LOG\x4 ‚     \x1       \x4   \x2       \x4   \x3   \x2   \x8   \x4 \x11\x11\x5 \x11\x11  \x12\x11  TStringField\x11ClientDataSet1Key\xCDisplayWidth\x2  FieldName\x6\x3Key\x4Size\x2\x1F  \xCTStringField\x13ClientDataSet1Value\xCDisplayWidth\x2\x1A FieldName\x6\x5Value\x4Size\x2\x1F    

Мне кажется, что если сохранять только их - это было-бы оптимальное решение, вот только - как?


Delirium   (2004-09-09 11:33:00) [15]

Ну если в ПОТОК, то лезем в кладезь знаний http://delphibase.endimus.comи находим там

procedure TStreamDirector.AddFromRecordSet(AName:String; ARecordSet:_RecordSet);
var adoStream:OleVariant;
   St:TStrings;
begin
// Сначала ADODB.RecordSet -> ADODB.Stream через XML
adoStream:=CreateOLEObject('ADODB.Stream');
Variant(ARecordSet).Save(adoStream, adPersistXML);
// Теперь XML -> TStrings
St:=TStringList.Create;
St.Text:=adoStream.ReadText(adoStream.Size);
// Ну а теперь всё просто
AddFromStrings(AName, St);
// Чищу память
St.Free;
adoStream:=UnAssigned;
end;


TStrings в ПОТОК поместишь?


Danilka   (2004-09-09 11:29:00) [16]

[4] sergch   (09.09.04 11:22)
Если возникает такая ошибка, то нада ставить апдейт :))


sergch   (2004-09-09 11:28:00) [17]

Мне надо сохранить в ПОТОК!


Delirium   (2004-09-09 11:24:00) [18]

Может это и забавно выглядит, но у TADODataSet есть методы
SaveToFile и LoadFromFile, как ни странно :)


sergch   (2004-09-09 11:22:00) [19]

Подскажите пожалуйста, если при выполнении
CliDSet.LoadFromStream(AStream);
периодически возникает ошибка  

exception class EAccessViolation with message "Access violation at address 4D1236A in module midas.dll"


KSergey   (2004-09-09 11:11:00) [20]

> [2] sergch   (09.09.04 11:04)
> Проверено - TClientDataSet глючит.

Ну разумеется! ;)


Страницы:   1 2

Наверх

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