Hier eine kleine Routine, die ein DataSet in eine BCP-Importdatei schreibt. Die Felder der Quell- und Zieltabelle müssen dabei in Reihenfolge und Typ übereinstimmen (Namen sind egal).
Delphi-Quellcode:
procedure ExportDataSetToBCP(DataSet: TDataSet; const FileName: string);
function GetBytesText(const ABytes: TBytes): string;
var
B: Byte;
begin
Result := '';
for B in ABytes do
Result := Result + IntToHex(B, 2);
end;
var
fld: TField;
S: string;
sep: string;
writer: TStreamWriter;
begin
writer := TStreamWriter.Create(FileName, False, TEncoding.ANSI);
try
DataSet.Active := true;
DataSet.First;
while not DataSet.Eof do begin
sep := '';
for fld in DataSet.Fields do begin
Writer.Write(sep);
if not fld.IsNull then begin
case fld.DataType of
ftDate: S := FormatDateTime('yyyy-mm-dd', fld.AsDateTime);
ftTime: S := FormatDateTime('hh:nn:ss', fld.AsDateTime);
ftDateTime: S := FormatDateTime('yyyy-mm-dd hh:nn:ss', fld.AsDateTime);
ftTimeStamp: S := FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', fld.AsDateTime);
ftBlob: S := GetBytesText(fld.AsBytes);
else
S := fld.DisplayText;
end;
Writer.Write(S);
end;
sep := #9;
end;
Writer.WriteLine;
DataSet.Next;
end;
finally
writer.Free;
end;
end;
Der passende BCP-Aufruf sehe dann folgendermaßen aus:
Code:
bcp <Database>.dbo.<Table> in "<ImportFile>" -b 10000 -c -C ACP -e "<ErrorFile>" -E -T -S <Server>
Die Platzhalter in spitzen Klammern müssen natürlich durch die tatsächlichen Werte ersetzt werden.