Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Leerstring an Datenfeld übergeben (https://www.delphipraxis.net/127633-leerstring-datenfeld-uebergeben.html)

BigAl 16. Jan 2009 10:59

Datenbank: MSSQL • Version: 2005 • Zugriff über: ADO

Leerstring an Datenfeld übergeben
 
Hallo zusammen,

folgendes Problem:

ich möchte einem Datenfeld einen Leerstring zuweisen. Z.B. mit "tblXY.FieldByName('Test').Value := ''". Der Typ des Datenfelds ist VARCHAR, also ein Zeichentyp. Soweit so gut. Delphi macht aus dem Leerstring aber immer automatisch NULL. Das Feld darf aber nicht NULL sein (NOT NULL). Wie kann ich dem Variant beibringen einen Leerstring nicht als NULL sonderen eben als Leerstring zu interpretieren? Das Problem tauscht komischerweise erst seit Delphi 2009 auf...

Alternativen mit ".AsString" und so habe ich auch schon probiert. Gleiches Problem...

Danke schonmal für eure Antworten...

Alex

Bernhard Geyer 16. Jan 2009 11:13

Re: Leerstring an Datenfeld übergeben
 
Ich erinnere mich das das Speichermanagement bei dem neuen String-Typ unterschiedlich ist wenn ein leerer String vorliegt. Vermutlich liegt hier ein Bug in D2009 vor.
Kannst du ein einfaches Demoprojekt erstellen und posten?

nahpets 16. Jan 2009 14:30

Re: Leerstring an Datenfeld übergeben
 
Hallo,
Zitat:

Zitat von Bernhard Geyer
Ich erinnere mich das das Speichermanagement bei dem neuen String-Typ unterschiedlich ist wenn ein leerer String vorliegt. Vermutlich liegt hier ein Bug in D2009 vor.

nene, kein Bug in Delphi 2009, das Problem hatte ich schon mit Delphi 6.

Was ist denn ein Leersting, doch ein String der Länge 0.

Kannst Du denn per Insert einen String der Länge 0 (also ein '') in die Datenbank einfügen und hast anschließend kein NULL in der Datenbank? Erst dann kannst Du Dir Gedanken darüber machen, ob Du in Delphi ein Problem lösen musst. Wenn die Datenbank einen Leerstring als NULL interpretiert, kommst Du mit Delphimitteln nicht an dem Problem vorbei.

Was Du probieren könntest:

Dem Value einen String mit einem Leerzeichen zuweisen und dann speichern. Einige Datenbanken/Schnittstellen/Treiber (SQL-Server glaub' ich auch, kann aber einstellungsabhängig sein) entfernen die am Ende befindlichen Leerzeichen, so dass Du auf diese Weise einen Leerstring in die Datenbank bekommen könntest.
Über das Thema "Eleganz" wollen wir uns dann bei dieser Lösung nicht unterhalten :wink:

Ansonsten: Value müsste ein Variant sein, wenn ja, versuch' es mal statt mit '' mit EmptyStr.

Bernhard Geyer 16. Jan 2009 14:38

Re: Leerstring an Datenfeld übergeben
 
Zitat:

Zitat von nahpets
Was ist denn ein Leersting, doch ein String der Länge 0.

Ein Leerstring ist aber was anderes als ein NULL/nil auf DB/Delphi-Ebene!

Zitat:

Zitat von nahpets
Wenn die Datenbank einen Leerstring als NULL interpretiert, kommst Du mit Delphimitteln nicht an dem Problem vorbei.

Dieses Verhalten kenn ich nur bei Oracle. Bei MS SQL Server kenn ich das nicht und wüsste auch nich das man sowas einstellen könnte.

nahpets 16. Jan 2009 14:49

Re: Leerstring an Datenfeld übergeben
 
Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von nahpets
Was ist denn ein Leersting, doch ein String der Länge 0.

Ein Leerstring ist aber was anderes als ein NULL/nil auf DB/Delphi-Ebene!

Klar, ein Leerstring ist weder Nil noch Null, er ist etwas (wenn auch nicht viel :wink:)

Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von nahpets
Wenn die Datenbank einen Leerstring als NULL interpretiert, kommst Du mit Delphimitteln nicht an dem Problem vorbei.

Dieses Verhalten kenn ich nur bei Oracle. Bei MS SQL Server kenn ich das nicht und wüsste auch nich das man sowas einstellen könnte.

Bin mir nicht sicher, bei welchen Datenbanken ich das Problem schon hatte.

BigAl 16. Jan 2009 20:39

Re: Leerstring an Datenfeld übergeben
 
Hallo,

Fakt ist, dass das Ganze mit Delphi 7 noch bestens funktioniert hat. Fakt ist auch, dass es natürlich ein Unterschied ist, ob man in der Datenbank ein Feld auf NULL setzt oder es eben mit einem leeren String ('') belegt. Da es sich bei der Software um ein recht großes Programm (> 200.000 Codezeilen) handelt und ich weltweit einige Installationen laufen habe kann ich auch nicht einfach die Datenbank ändern. Evtl. handle ich mir dann neue Probleme auf Datenbankebene ein. Könnte ja da NULLs zulassen und dann in Delphi entsprechend auswerten (if Empty dann '' ...). Ist halt dann auch immer die Frage ob ich alle Stellen im Quellcode gefunden habe wo solche Probleme auftreten können...

Wenn ich das Ganze mit einem normalen Variant mache funktioniert es... Werde wohl nicht drum rum kommen mal wieder die VCL im Debugger zu analysieren... Ich halte euch auf jeden Fall auf dem Laufenden, wenn ich dann weiss wo dieses Verhalten herkommt.

Alex

Bernhard Geyer 16. Jan 2009 23:10

Re: Leerstring an Datenfeld übergeben
 
Wie gesagt: Irgendwo wurde im DN-Bereich von Codegear mal über die Unterschiede Philosophiert. Und dort wurde wenn ich mich recht erinnere geschrieben das eine leerer String in D2009 auch etwas von einem nil-Zeiger hat und es deshalb bei Codeportierungen Probleme an dieser Stelle geben könnte. Vermutlich ist genau dieses Problem bei ADOExpress/dbGo der Fall.

BigAl 18. Jan 2009 14:07

Re: Leerstring an Datenfeld übergeben
 
Probleme gibt es definitiv...

Das Feld ist ein TWideStringField. Wenn ich einen leeren Eintrag aus der Datenbank lese, dann hat Value den Wert ''. Das ist korrekt. Weise ich aber Value den String '' zu, dann hat Value sofort NULL...

Alex

nahpets 19. Jan 2009 07:54

Re: Leerstring an Datenfeld übergeben
 
Hast Du schonmal EmptyStr versucht?

BigAl 20. Jan 2009 07:34

Re: Leerstring an Datenfeld übergeben
 
EmptyStr ist definiert als "string = ''" (siehe SysUtils).

Was soll das bringen??? bzw. Neee, funktioniert nicht...

Alex

sofl 20. Jan 2009 09:13

Re: Leerstring an Datenfeld übergeben
 
hast du tblXY.FieldByName('Test').Value := '\0'

oder tblXY.FieldByName('Test').Value := '\"\b' schonmal versucht?

BigAl 25. Jan 2009 19:40

Re: Leerstring an Datenfeld übergeben
 
Zitat:

Zitat von sofl
hast du tblXY.FieldByName('Test').Value := '\0'

oder tblXY.FieldByName('Test').Value := '\"\b' schonmal versucht?

Hi,

sorry für die späte Antwort. War mal eben 'ne Woche in Malaysia unterwegs :tongue:.

Also: habe ich noch nicht versucht, kann ich aber noch testen. Doof wäre es aber trotzdem. Den Leerstring erhalte ich aus einem Eingabefeld. Müsste dann jedesmal die Eingabe auf Leerstring überprüfen und den String entsprechend anpassen.

Vom Gefühl her steht aber in der Datenbank nacher '\0' bzw. '\"\b' drin. Warum sollte dieser Strin irgendwo angepasst werden???

Alex

ThorstenElmers 13. Jun 2019 05:56

AW: Leerstring an Datenfeld übergeben
 
Guten Morgen.

Wir haben aktuell auch das Problem.
Zitat:

Zitat von BigAl (Beitrag 873104)
Also: habe ich noch nicht versucht, kann ich aber noch testen.

Hast Du da damals eine Lösung gefunden. Ist zwar ewig her, aber vielleicht kann es uns helfen. :)

Gruß
Thorsten

hoika 13. Jun 2019 06:27

AW: Leerstring an Datenfeld übergeben
 
Hallo,
ich wurde mal IsNull:= False setzen.

haentschman 13. Jun 2019 07:39

AW: Leerstring an Datenfeld übergeben
 
Moin...8-)
Zitat:

tblXY.FieldByName('Test').Value := ''...Delphi macht aus dem Leerstring aber immer automatisch NULL
Delphi-Quellcode:
tblXY.FieldByName('Test').AsString := ''
... ergibt einen leeren String in der DB. Nicht NULL. :wink:

PS: Immer den exakten Datentyp übergeben. AsString, AsInteger etc. Da hängt nicht Variant dazwischen und das gecaste auf den richtigen Typ fällt weg.

scrat1979 14. Jun 2019 22:04

AW: Leerstring an Datenfeld übergeben
 
Gerade kein Delphi zur Hand aber ich meine es gibt was wie

Delphi-Quellcode:
FieldByName('Feldname').Clear;
Oder so ähnlich

peterbelow 14. Jun 2019 23:06

AW: Leerstring an Datenfeld übergeben
 
Zitat:

Zitat von scrat1979 (Beitrag 1434671)
Gerade kein Delphi zur Hand aber ich meine es gibt was wie

Delphi-Quellcode:
FieldByName('Feldname').Clear;
Oder so ähnlich

Gibt es, aber das setzt das Feld auf NULL.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 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