Autor Beitrag
xeus
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 30.12.08 12:33 
Hallo,

Folgendes will ich realisieren:

Ich möchte nur bestimmte Records von der einen Datenbank ion die andere kopieren.

Dabei ergibt sich folgendes Problem:
Ich habe zwei ADOQueries, die auf zwei unterschiedliche Datenbanken zugreifen, die Struktur der Datenbanken ist aber gleich.
Auf die ADOQueries greife ich mit je einem DBGrid zur Darstellung zu.

Nun will ich einen bestimmetn Record der 1.DB (am Besten den den ich im DBGrid1 markiert habe) in die 2.DB klonen, oder export/Importieren.
Hab hierzu schon folgende dienge Versucht.

ADOQuery Recordset in eine XML exportiert -> Importiert

ADOQuery Recordset savetofile / Loadtofile

ADOQuery Recordset clone


Alle 3 Varianten, kopieren den Record, und schreiben ihn sogar in DBGRID2, aber irgendiwe übernimmt die 2.DB die Daten nicht.
Immer wenn ich sie kopiert hab, stehen sie auch gespiegelt in der DBGrid2, aber wenn ich das programm beende und die DB kontrolliere, hat sich nichts getan.

Vielleicht habt Ihr ja eine Lösung, ist bestimmt total easy.

Vielen Dank
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 30.12.08 13:02 
Könnte es sein, dass die Transaktion nicht commited wird?
xeus Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 30.12.08 13:13 
Sorry du musst mir verzeihen bin nicht so bewandert mit ADO und Delphi.

z.B.

adoquery2.insert
AdoQuery2.clone(adoQuery1);


Wie commited man richtig?
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 30.12.08 13:26 
ADO ist auch nicht gerade mein Spezialgebiet, aber ich denke, dass es da etwas wie Transaction.Commit gibt.
xeus Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 30.12.08 13:35 
Im Anhang findet Ihr meinen Screenshoot zum verständniss.

Ich habe folgendes gemacht:


Ich habe von Torrys folgende functionen:
zum Schreiben der XML:
function RecordsetToXML(const Recordset:_Recordset):string;
var
RS: Variant;
Stream: TStringStream;

begin
Result:='';
if Recordset= nil then Exit;
Stream:=TStringStream.Create('');
try
RS:=CreateOleObject('ADODB.Recordset');
RS:=Recordset;
RS.Save(TStreamAdapter.Create(stream) as IUnknown, adPersistXML);
Stream.Position:=0;
Result:=Stream.DataString;
finally
stream.Free
end;
end;


Und einmal zu lesen:
function RecordsetfromXML(const XML:string):_Recordset;
var
RS: Variant;
Stream: TStringStream;
begin
Result:=nil;
if XML='' then exit;
try
stream:=tstringstream.Create(XML);
Stream.position:=0;
RS:=CreateOLEObject('ADODB.Recordset');
RS.open(TStreamadapter.Create(Stream) as IUnknown);
Result:=IUnknown(RS) as _Recordset;
finally
stream.Free;
end;
end;

Die beiden Buttons (siehe Screenshoot) Schreiben die XML in ein Memo und Laden es.

procedure TForm1.SchreibeXML(Sender: TObject);
begin
memo2.Lines.Text:=RecordsettoXML(ADOQuery1.Recordset);
end;


procedure TForm1.LadeXML(Sender: TObject);
begin
Adoconnection3.BeginTrans;
Try
ADOQuery2.Recordset:=RecordsetfromXML(Memo2.Lines.Text);
ADOconnection3.CommitTrans;
Except
ADOConnection3.RollbackTrans;
Raise;
end;
end;

Ich kann machen, was ich will, die DB übernimmt die Änderungen einfach nicht.


Das Ziel is es einen bestimmten Record (markierung im DBGRID) der DB1 in die DB2 zu kopieren.
Einloggen, um Attachments anzusehen!
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: Mi 14.01.09 23:52 
Normalerweise wird das Beschreiben von Feldern in eine Datenbank mit Query.Post abgeschlossen.
Könnte das hier vielleicht auch helfen.