AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Leerstring an Datenfeld übergeben
Thema durchsuchen
Ansicht
Themen-Optionen

Leerstring an Datenfeld übergeben

Ein Thema von BigAl · begonnen am 16. Jan 2009 · letzter Beitrag vom 14. Jun 2019
Antwort Antwort
Seite 1 von 2  1 2      
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
495 Beiträge
 
Delphi 12 Athens
 
#1

Leerstring an Datenfeld übergeben

  Alt 16. Jan 2009, 10:59
Datenbank: MSSQL • Version: 2005 • Zugriff über: ADO
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
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Leerstring an Datenfeld übergeben

  Alt 16. Jan 2009, 11:13
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?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: Leerstring an Datenfeld übergeben

  Alt 16. Jan 2009, 14:30
Hallo,
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

Ansonsten: Value müsste ein Variant sein, wenn ja, versuch' es mal statt mit '' mit EmptyStr.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Leerstring an Datenfeld übergeben

  Alt 16. Jan 2009, 14:38
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 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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

Re: Leerstring an Datenfeld übergeben

  Alt 16. Jan 2009, 14:49
Zitat von Bernhard Geyer:
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 )

Zitat von Bernhard Geyer:
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.
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
495 Beiträge
 
Delphi 12 Athens
 
#6

Re: Leerstring an Datenfeld übergeben

  Alt 16. Jan 2009, 20:39
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
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Leerstring an Datenfeld übergeben

  Alt 16. Jan 2009, 23:10
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
495 Beiträge
 
Delphi 12 Athens
 
#8

Re: Leerstring an Datenfeld übergeben

  Alt 18. Jan 2009, 14:07
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
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

Re: Leerstring an Datenfeld übergeben

  Alt 19. Jan 2009, 07:54
Hast Du schonmal EmptyStr versucht?
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
495 Beiträge
 
Delphi 12 Athens
 
#10

Re: Leerstring an Datenfeld übergeben

  Alt 20. Jan 2009, 07:34
EmptyStr ist definiert als "string = ''" (siehe SysUtils).

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

Alex
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 02:00 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