AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Paradox nach MSSQL

Ein Thema von egentur · begonnen am 6. Dez 2018 · letzter Beitrag vom 14. Dez 2018
Antwort Antwort
Seite 2 von 2     12   
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.211 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Paradox nach MSSQL

  Alt 7. Dez 2018, 14:13
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
  Mit Zitat antworten Zitat
egentur

Registriert seit: 27. Sep 2006
Ort: Freising
60 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#12

AW: Paradox nach MSSQL

  Alt 7. Dez 2018, 14:18
Ich muss hier aber die Liste der Felder bime Insert mit angeben,
da die Zieltabelle mehr Felder als die Quelltabelle hat.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Paradox nach MSSQL

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

Registriert seit: 27. Sep 2006
Ort: Freising
60 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#14

AW: Paradox nach MSSQL

  Alt 7. Dez 2018, 14:49
Hallo Herr Raabe

Dsa wäre sehr nett !!

Gruß
egentur
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
 
Delphi 6 Professional
 
#15

AW: Paradox nach MSSQL

  Alt 7. Dez 2018, 14:56
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.. )
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Paradox nach MSSQL

  Alt 7. Dez 2018, 23: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
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.211 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Paradox nach MSSQL

  Alt 8. Dez 2018, 10:24
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?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Paradox nach MSSQL

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

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.211 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: Paradox nach MSSQL

  Alt 8. Dez 2018, 16:10
  Mit Zitat antworten Zitat
egentur

Registriert seit: 27. Sep 2006
Ort: Freising
60 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#20

AW: Paradox nach MSSQL

  Alt 14. Dez 2018, 15:04
Hallo TigerLilly, hallo Herr Raabe

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

Nochmals vielen Dank
egentur
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:30 Uhr.
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