Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#16

AW: Paradox nach MSSQL

  Alt 7. Dez 2018, 22:39
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat