Форум: "Базы";
Текущий архив: 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");
Вот результат сохранения
TPF0TADODataSetADODataSet1
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 TStringFieldClientDataSet1KeyDisplayWidth FieldNameKeySize TStringFieldClientDataSet1ValueDisplayWidth 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