Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Paradox nach MSSQL (https://www.delphipraxis.net/198865-paradox-nach-mssql.html)

TigerLilly 7. Dez 2018 13:13

AW: Paradox nach MSSQL
 
Welchen Fehler bekommst du denn genau?

Versuch mal den Text zu casten: auf varchar(max) oder teile den string in Teil auf auf und CONCAT die.

https://stackoverflow.com/questions/...sert-statement
https://stackoverflow.com/questions/...-in-sql-server

egentur 7. Dez 2018 13:18

AW: Paradox nach MSSQL
 
Ich muss hier aber die Liste der Felder bime Insert mit angeben,
da die Zieltabelle mehr Felder als die Quelltabelle hat.

Uwe Raabe 7. Dez 2018 13:39

AW: Paradox nach MSSQL
 
Zitat:

Zitat von egentur (Beitrag 1420306)
Ich muss hier aber die Liste der Felder bime Insert mit angeben,
da die Zieltabelle mehr Felder als die Quelltabelle hat.

Ich nehme mal an, das bezieht sich auf den bcp-Import? Dann ist das kein Problem. Das bcp erwartet eine Textdatei, die dem Feldaufbau der Tabelle entspricht. Man muss also lediglich beim Erstellen der Datei den Feldaufbau der Zieltabelle kennen und die Felder in der passenden Reihenfolge ausgeben bzw. leer lassen.

Wenn wirklich echtes Interesse besteht, würde ich das ja mal an einem konkreten Beispiel aufzeigen.

egentur 7. Dez 2018 13:49

AW: Paradox nach MSSQL
 
Hallo Herr Raabe

Dsa wäre sehr nett !!

Gruß
egentur

HolgerX 7. Dez 2018 13:56

AW: Paradox nach MSSQL
 
Hmm..

(Mal ganz D6 Progger, Quick and Dirty);

Ich würde nen keines Tool schreiben, welches eine Connection per ADO zur Paradox-Datenbank öffnet, nen query mit dem Select für die benötigten Daten.
(Alles simple per Button click)

Delphi-Quellcode:
ADOQuery.Open;
ADOQuery.SaveToFile(ExtractFilePath(ParamStr(0)) + 'Test.Dat', pfXML);
ADOQuery.Close;
Somit werden alle Daten in eine XML-Datei geschrieben (natürlich den Dateinamen nach deinen Wünschen ändern.

Über einen 2. Button das selbe Tool verwenden, um eine Verbindung zur MSSQL-Datenbank zu öffen (ebenfalls per ADO)
und dann kannst Du mit

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  ADOQuery.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Test.Dat');
  ADOQuery.First;
  While not ADOQuery.Eof do begin
    // Insert mit den Daten aus ADOQuery....

    ADOQuery.Next;
  end;
  ADOQuery.Close;
end;
einen gezielten Insert machen, ganz nach deinen Wünschen..

Hierbei werden die Daten 1:1 übertragbar...

Somit bei Paradox Button1, Datendatei und Tool auf anderen Server mitnehmen und per Button2 dort in die MSSQL Datenbank schieben...

Geschrieben in wenigen Minuten...

(Nur so nen Gedanke.. ;) )

Uwe Raabe 7. Dez 2018 22:39

AW: Paradox nach MSSQL
 
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.

TigerLilly 8. Dez 2018 09:24

AW: Paradox nach MSSQL
 
Weil diese Importsachen in der Praxis so kompliziert sein können:

- Wenn ein Text TAB oder CR/LF enthält, stört das das BCP gar nicht?
- Sollten die Hexzeichen nicht mit 0x eingeleitet werden?
- Sollten nicht Floats auch in Standard-US-Format gebracht werden?

Uwe Raabe 8. Dez 2018 10:02

AW: Paradox nach MSSQL
 
Zitat:

Zitat von TigerLilly (Beitrag 1420354)
Weil diese Importsachen in der Praxis so kompliziert sein können:

- Wenn ein Text TAB oder CR/LF enthält, stört das das BCP gar nicht?
- Sollten die Hexzeichen nicht mit 0x eingeleitet werden?
- Sollten nicht Floats auch in Standard-US-Format gebracht werden?

Das gezeigte Beispiel entstammt einer konkreten Portierung von NexusDB nach MSSQL, erhebt keinen Anspruch auf Vollständigkeit und deckt vermutlich auch nur den damals tatsächlich importiereten Datenbestand ab. Es ist aber leicht ersichtlich, wo und wie die übrigen Fälle behandelt werden müssen. Für genauere Spezifikationen des erwarteten Formats verweise ich jetzt einfach mal auf die Dokumentation zu BCP.

Zu den konkreten Fragen:
- In dem Fall muss man halt andere Feld- bzw. Record-Trennzeichen(-folgen) definieren, die nicht zu Kollisionen mit dem Datenbestand führen.
- Nicht wenn das Feld in MSSQL als VARBINARY angelegt ist. Andernfalls wäre die Hexdarstellung auch wohl nicht geeignet.
- Vermutlich ja, aber das war in diesem Fall schon von der Einstellung in Windows vorgegeben.

TigerLilly 8. Dez 2018 15:10

AW: Paradox nach MSSQL
 
:thumb:

egentur 14. Dez 2018 14:04

AW: Paradox nach MSSQL
 
Hallo TigerLilly, hallo Herr Raabe

die Funktion
f_hextostr(hexstring)
hat schon funktioniert, da das Zielfeld vom Typ Memo war.

Nochmals vielen Dank
egentur


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz