Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

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

 
sergch   (2004-09-09 10:52) [0]

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

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

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

TPF0 TADODataSet ADODataSet1
CursorTypectStaticLockTypeltBatchOptimistic
Parameters

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


 
Digitman ©   (2004-09-09 10:57) [1]


> Однако данные не сохранились


с чего бы им сохраняться-то ?


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


а зачем ? смысл каков ?

если уж на то пошло, то существует TClientDataset, позволяющий сохранять/восстанавливать НД


 
sergch   (2004-09-09 11:04) [2]

Проверено - TClientDataSet глючит.
А смысл сохранения - в автономности данных.


 
KSergey ©   (2004-09-09 11:11) [3]

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

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


 
sergch   (2004-09-09 11:22) [4]

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

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


 
Delirium ©   (2004-09-09 11:24) [5]

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


 
sergch   (2004-09-09 11:28) [6]

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


 
Danilka ©   (2004-09-09 11:29) [7]

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


 
Delirium ©   (2004-09-09 11:33) [8]

Ну если в ПОТОК, то лезем в кладезь знаний 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 в ПОТОК поместишь?


 
sergch   (2004-09-09 11:48) [9]

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

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

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

(Data
™   •   –аЅ             ѓ Key I    WIDTH   Value I    WIDTH   
CHANGE_LOG ‚                                   11 11  21  TStringFieldClientDataSet1Key DisplayWidth  FieldNameKeySize   TStringFieldClientDataSet1Value DisplayWidth FieldNameValueSize    

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


 
Delirium ©   (2004-09-09 11:51) [10]

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


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

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

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


 
Digitman ©   (2004-09-09 11:55) [12]


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


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


 
Delirium ©   (2004-09-09 12:01) [13]

Это-же пример, а не готовый код, хочешь чтобы за тебя написали всё? Изволь..
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 отличий :)


 
sergch   (2004-09-09 12:05) [14]

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

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


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

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

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

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

Delphi6


 
Delirium ©   (2004-09-09 12:22) [16]

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


 
Delirium ©   (2004-09-09 12:25) [17]

Писал "в слепую", только что проверил, вот 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.

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


 
sergch   (2004-09-09 12:35) [18]

DataSet - активный

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

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


 
Delirium ©   (2004-09-09 12:40) [19]

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


 
sergch   (2004-09-09 12:49) [20]

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

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

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


 
Delirium ©   (2004-09-09 13:01) [21]

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

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


 
Digitman ©   (2004-09-09 14:08) [22]


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


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

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



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

Текущий архив: 2004.10.10;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.041 c
14-1095859478
ODINUS
2004-09-22 17:24
2004.10.10
Помогите


1-1096013372
Koala
2004-09-24 12:09
2004.10.10
Опять про MDI приложение....


4-1093959708
Jiurasrasr
2004-08-31 17:41
2004.10.10
Как отключить эффект сворачивания окна?


14-1095848482
Григорьев Антон
2004-09-22 14:21
2004.10.10
Забавная картинка из корейского метро


1-1096034724
ShproTT
2004-09-24 18:05
2004.10.10
Delphi+MS Word