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