Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Вниз

Сохранение 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.037 c
3-1094817179
mouse_web
2004-09-10 15:52
2004.10.10
Компонент соединения с базой Firebird


4-1093986950
S@shka
2004-09-01 01:15
2004.10.10
нет работает SetWaitableTimer


1-1096211032
APXi
2004-09-26 19:03
2004.10.10
Фокус MDI формы


1-1095781449
SergeyRu
2004-09-21 19:44
2004.10.10
Подключение справки от компоненты к Делфи 6


14-1095620257
SergeyGood
2004-09-19 22:57
2004.10.10
Твикер на Дельфи 7





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский