Entwickler-Ecke
Datenbanken - Recordset in anderes ADOQuery kopieren
xeus - Di 30.12.08 12:33
Titel: Recordset in anderes ADOQuery kopieren
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
Delete - Di 30.12.08 13:02
Könnte es sein, dass die Transaktion nicht commited wird?
xeus - 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?
Delete - 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 - 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.
SmileySN - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!