Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:37 Uhr.
Seite 1 von 2  1 2      

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