Har du data liggende på samme sql-server? Så kan du forbinde til den direkte og føre data over.
Jeg lavede dette i forbindelse med jeg skulle reetablere data som på mystisk vis var forsvundet hos kunden. Heldigvis havde jeg en kopi af databasen:
procedure TfrmMain.ExportData(aClientDataSet: TClientDataSet; aTablename: string; aLog: TStrings);
begin
assert(fOperationType = otExport);
aClientDataSet.Open;
try
aClientDataSet.SaveToFile(format('cds_%s.dat',[aTablename]),dfbinary);
aLog.Add(format('%s: %d records',[aTablename,aclientDataSet.RecordCount]));
finally
aClientDataSet.Close;
end;
end;
ClientDataSættet er forbundet til en TADOQuery der henter data til det. Det er hvad eksportfunktionen bruger.
procedure TfrmMain.ImportData(aDataset: TDataSet; aInsertScript: TStringList; aTablename: string);
var
i: integer;
Field: TField;
Stream: TStream;
Query: TADOQuery;
Parameter: TParameter;
begin
assert(fOperationType = otImport);
Query := DM.CreateQuery;
DM.ADOConnection.Execute(format('SET IDENTITY_INSERT dbo.%s ON',[aTablename]));
try
Query.SQL.Assign(aInsertScript);
DM.ADOConnection.BeginTrans;
try
with aDataset do
begin
First;
while not Eof do
begin
for i := 0 to Fields.Count - 1 do
begin
Field := Fields[i];
Parameter := Query.Parameters.FindParam(Field.FieldName);
if assigned(Parameter) then
begin
if Field.IsNull then
Parameter.Value := NULL
else
Parameter.Assign(Field);
if Field.IsNull then
begin
Parameter.Value := NULL;
mLog.Lines.Add(format('%s = NULL',[Field.FieldName]));
end
else begin
Parameter.Assign(Field);
mLog.Lines.Add(format('%s',[Field.FieldName]));
end;
end;
end;
// Query.SaveQueryToFile(aTablename + FieldByName('ref').AsString + '.sql');
Query.ExecSQL;
Next;
end;
DM.ADOConnection.CommitTrans;
MessageDlg(format('Genindsat %d records',[RecordCount]), mtInformation, [mbOK], 0);
end;
except
DM.ADOConnection.RollbackTrans;
raise;
end;
finally
DM.ADOConnection.Execute(format('SET IDENTITY_INSERT dbo.%s OFF',[aTablename]));
Query.Free;
end;
end;
Hos kunden er min ADOConnection forbundet til deres database og så importerer jeg via et kald der indholder mit insertscript.
procedure TfrmMain.btnImportSagskortdatoerClick(Sender: TObject);
const
Tablename = 'mytablename';
var
List: TStringList;
begin
List := TStringList.Create;
try
List.Clear;
List.Add(format('insert into dbo.%s',[Tablename]));
List.Add('(ref');
List.Add(',oprettet');
List.Add(',..');
List.Add(',..');
List.Add(',..');
List.Add(',..)');
List.Add('values');
List.Add('(:ref');
List.Add(',:oprettet');
List.Add(',:..');
List.Add(',:..');
List.Add(',:..');
List.Add(',:..)');
ImportData(DM.cdsMyTable,List,Tablename);
finally
List.Free;
end;
end;
Scriptet fik jeg MS management studio til at generere, men kunne ligeså godt have dannet det på baggrund af select-scriptet i min ADOQuery.
Bemærk, at mine ref-felter er primærnøglen og de er autoincrementerende. Ved at pille ved IDENTITY INSERT sætter jeg data ind på de samme pladser som de havde.
... jeg ved ikke om du kan bruge det til noget, men det var en sjov lille øvelse som kom til at fungere med alle slags felttyper.