![]() |
Datenbank: MS SQL / DB2 • Version: 2008 / • Zugriff über: ODBC
MS SQL CHAR(300) Feld übernehmen
Guten Morgen alle zusammen!
In einer IBM DB2 ist ein Char - Feld in der Länge von 300 Zeichen definiert worden. Dieses Feld wird durch Progs auf einer System I mit Ziffern (und in seltenen Fällen am Ende mit Buchstaben) gefüllt. Daneben gibt es eine MS SQL Datenbank, in der ebenfalls ein Feld in der Länge CHAR(300) definiert ist. Nun muss ich dieses Feld von der DB2 in die MS SQL bringen! Dazu wollte ich:
Delphi-Quellcode:
die Übertragung machen. Delphi XE2 interpretiert das Ganze aber immer als numerischen Wert, sagt mir, dass die Zahl zulang ist und wirft folgende Exception:
qryIns := 'INSERT tblMS (chrFeld300) VALUES (' + qryDB2.FieldByName('FELD300').AsVariant + ')';
qryIns.ExecSQL;
Delphi-Quellcode:
Hat jemand eine Idee, wie ich das bewerstelligen kann?
---------------------------
Benachrichtigung über Debugger-Exception --------------------------- Im Projekt Barg_Info.exe ist eine Exception der Klasse EDBEngineError mit der Meldung 'Allgemeiner SQL-Fehler [Microsoft][ODBC SQL Server Driver][SQL Server]The number '010014422006620121026000000045135066105329500006000010012000000010605965670' is out of the range for numeric representation (maximum precision 38). [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'Front'.' aufgetreten. --------------------------- Anhalten Fortsetzen Hilfe --------------------------- Danke und viele Grüße Rolf |
AW: MS SQL CHAR(300) Feld übernehmen
Versuche es mal mit (SQL-)Parametern
|
AW: MS SQL CHAR(300) Feld übernehmen
Wenn du deinen als Zahl in den SQL-String legst ist das keine Wunder ....
Mach am besten auch gleich das was mkinzer vorschlägt. Sonst hast du probleme wenn deine DB2-Datensatz sowas wie "''; DELETE FROM tblMS; //" beinhalten sollte ... |
AW: MS SQL CHAR(300) Feld übernehmen
Hallo
und vielen Dank - das werde ich mal testen! Rolf |
AW: MS SQL CHAR(300) Feld übernehmen
Wenn ich jetzt wüßte wie Du Dein Programm auf ODBC zugreifen läßt...
aber die meisten (mir bekannten) Schnittstellen unterstützen .asstring, das würde unter Umständen besser funktionieren als das .asVariant. Davon abgesehen Parameter ! Gruß K-H |
AW: MS SQL CHAR(300) Feld übernehmen
Das Problem ist nicht wegen AsVariant und lässt sich auch mit AsString nicht beheben.
Denn das daraus resultierende Statement lautet so:
Code:
Für dieses Statement wird der Wert als Zahl interpretiert und diese Umwandlung schlägt eben fehl (genau das sagt ja auch die Fehlermeldung).
INSERT INTO tblMS (chrFeld300) VALUES (010014422006620121026000000045135066105329500006000010012000000010605965670)
Da SQL etwas tolerant ist, kann es auch eine Zahl in ein Char-Feld speichern. Hier soll aber keine Zahl, sondern eine Ziffernfolge gespeicht werden und das ist ein String/Char/Varchar. Dann sollte man dem Statement dieses auch mitteilen: "Hallo, das ist bitte als Zeichenfolge zu verstehen."
Code:
Und damit alles im Leben einfacher, schneller - und viel wichtiger sicherer - wird, sind Parameter hier unbedingt zu empfehlen.
INSERT INTO tblMS (chrFeld300) VALUES ("010014422006620121026000000045135066105329500006000010012000000010605965670")
Code:
oder in Delphi
INSERT INTO tblMS (chrFeld300) VALUES ( :chrFeld300 )
Delphi-Quellcode:
Das ist dann nicht nur sicherer, einfacher sondern vor allem erheblich schneller, da der Server jetzt schon weiß, was er machen soll und kann sich darauf vorbereiten (prepare). Es werden nur noch die reinen Daten vom Client übertragen, weil die Anweisung dem Server ja schon bekannt ist.
qryIns.SQL.Text := 'INSERT INTO tblMS (chrFeld300) VALUES ( :chrFeld300 )';
// teilweise gibt es auch noch eine spezielle Methode zum Vorbereiten // hängt aber von der Zugriffskomponente ab // qryIns.Prepare; while not qryDB2.EOF do begin qryIns.ParamByName( 'chrFeld300' ).Value := qryDB2.FieldByName('FELD300').AsVariant; qryIns.ExecSQL; qryDB2.Next; end; // qryIns.Unprepare; |
AW: MS SQL CHAR(300) Feld übernehmen
Zitat:
|
AW: MS SQL CHAR(300) Feld übernehmen
Zitat:
Hat er doch? ist doch MS!? Gruß K-H |
AW: MS SQL CHAR(300) Feld übernehmen
Zitat:
Das ist aber obsolet, da man entweder mit Parametern (first choice) arbeitet oder das entsprechende Quoten/Escapen durch eine DBMS Funktion erledigen sollte (was bei der Verwendung von Parametern implizit erfolgt) |
AW: MS SQL CHAR(300) Feld übernehmen
Zitat:
Dort kenn ich nur dieses "wir machen alles anders als der SQL-Standard". |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz