Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Advantage Database - Null-Werte (https://www.delphipraxis.net/163867-advantage-database-null-werte.html)

bwolf 19. Okt 2011 16:14

Datenbank: ads • Version: 10 • Zugriff über: TDatasetDescendant

Advantage Database - Null-Werte
 
Hallo,

ich habe eine Tabelle in der ein Char-Feld mit NOT NULL und Default-Wert '' definiert ist.
Nun habe ich folgendes Problem:
Wenn ich in einer Delphi-Anwendung dies Tabelle öffne und das Feld auf Null prüfe (adsTable1.FieldByName('Feld').IsNull), bekomme ich ein "True" zurück.
Wenn ich aber im DataArchitect die Abfrag "Select * FROM Table WHERE Feld IS NULL" ausführe, bekomme ich 0 Datensätze geliefert.

Hat jemand eine Erklärung wie das sein kann?
Danke!

Bernhard Geyer 19. Okt 2011 16:18

AW: Advantage Database - Null-Werte
 
da haben wohl die ADS-Kompos nen kleinen Bug.
Poste das doch mal in deren Forum.

mkinzler 19. Okt 2011 16:18

AW: Advantage Database - Null-Werte
 
Dann hat u definiert, dass '' delphiseitig als Null zu betrachten ist.

bwolf 19. Okt 2011 16:39

AW: Advantage Database - Null-Werte
 
Hi und danke für eure Antworten.

Hm also irgendwas passt da nicht so ganz.

Ich habe gerade nochmal ein Test gemacht und eune neue Tabelle angelegt. Bei der hat mir dann "isNull" das korrekte Ergebis geliefert.
Einziger Unterschied war, das das Feld in der Test-Tabelle vom Typ "character" statt "nvarchar" ist.

Also nochmal eine Tabelle erstellt mit Feld 1 als Char NOT NULL und Default '' und
Feld 2 als NVarChar NOT NULL und Default ''.

Dann über delphi einen Datensatz angelegt und beide Felder nicht befüllt.
Und tatsächlich:
adsTable1.FieldByName('test1').IsNull = False (korrekt)
adsTable1.FieldByName('test1').IsNull = True (Falsch)

hm :/

Bernhard Geyer 19. Okt 2011 16:44

AW: Advantage Database - Null-Werte
 
nvarchar (Unicode) kann ADS noch nicht lange. Wird vermutlich hier ein "bugchen" mit Length(AnsiChar) <> Length(WideChar) sich eingeschlichen haben.

Wie gesagt: Melde es im Forum dort oder warte bis Joachim Dürr vorbeit schaut und es mit nimmt.

bwolf 19. Okt 2011 17:27

AW: Advantage Database - Null-Werte
 
Jo werde ich machem, danke für die Hilfe!

joachimd 20. Okt 2011 08:48

AW: Advantage Database - Null-Werte
 
Zitat:

Zitat von bwolf (Beitrag 1131317)
Hallo,

ich habe eine Tabelle in der ein Char-Feld mit NOT NULL und Default-Wert '' definiert ist.
Nun habe ich folgendes Problem:
Wenn ich in einer Delphi-Anwendung dies Tabelle öffne und das Feld auf Null prüfe (adsTable1.FieldByName('Feld').IsNull), bekomme ich ein "True" zurück.
Wenn ich aber im DataArchitect die Abfrag "Select * FROM Table WHERE Feld IS NULL" ausführe, bekomme ich 0 Datensätze geliefert.

Hat jemand eine Erklärung wie das sein kann?
Danke!

Setze mal AdsTable.AdsTableOptions.AdsPreserveSpaces auf TRUE. Ich nehme an, du hast das Feld einfach falsch befüllt;)

bwolf 20. Okt 2011 11:04

AW: Advantage Database - Null-Werte
 
Hi Joachim,

danke für deine Antwort!
Inwiefern meinst du das ich die Felder falsch befüllt habe?
Ich habe die Felder ja garnicht befüllt, sonder den ADS den Default-Wert eintragen lassen.

Ich poste hier mal das Create-Script der Test-Tabelle und den Delphi-Code mit dem ich getestet habe.

Code:
CREATE TABLE test ( 
      test1 Char( 50 ),
      test2 Char( 50 ),
      test3 NVarChar( 50 )) IN DATABASE;
EXECUTE PROCEDURE sp_ModifyTableProperty( 'test',
   'Table_Auto_Create',
   'False', 'APPEND_FAIL', 'testfail');

EXECUTE PROCEDURE sp_ModifyTableProperty( 'test',
   'Table_Permission_Level',
   '2', 'APPEND_FAIL', 'testfail');

EXECUTE PROCEDURE sp_ModifyTableProperty( 'test',
   'Table_Memo_Block_Size',
   '8', 'APPEND_FAIL', 'testfail');

EXECUTE PROCEDURE sp_ModifyTableProperty( 'test',
   'Triggers_Disabled',
   'False', 'APPEND_FAIL', 'testfail');

EXECUTE PROCEDURE sp_ModifyTableProperty( 'test',
   'Table_Trans_Free',
   'False', 'APPEND_FAIL', 'testfail');

EXECUTE PROCEDURE sp_ModifyFieldProperty ( 'test',
      'test2', 'Field_Can_Be_Null',
      'False', 'APPEND_FAIL', 'testfail' );

EXECUTE PROCEDURE sp_ModifyFieldProperty ( 'test',
      'test2', 'Field_Default_Value',
      '''''', 'APPEND_FAIL', 'testfail' );

EXECUTE PROCEDURE sp_ModifyFieldProperty ( 'test',
      'test3', 'Field_Can_Be_Null',
      'False', 'APPEND_FAIL', 'testfail' );

EXECUTE PROCEDURE sp_ModifyFieldProperty ( 'test',
      'test3', 'Field_Default_Value',
      '''''', 'APPEND_FAIL', 'testfail' );

Anschließend wird per Delphi ein Datensatz erzeugt in dem nur das Feld "test1" gefüllt wird:
Code:
  AdsTAble1.Insert;
  adsTable1.FieldByName('test1').asstring := 'value';
  AdsTAble1.Post;
Und nun prüfe ich die Felder "test2" und "test3" auf NULL ab - was in beiden Fällen FALSE ergeben sollte da beide Felder als NOT NULL definiert sind:

Code:
  adsTable1.FieldByName('test3').isNull; // False -> Korrekt
  adsTable1.FieldByName('test3').isNull; // True -> Nicht korrekt

joachimd 20. Okt 2011 11:54

AW: Advantage Database - Null-Werte
 
Zitat:

Zitat von bwolf (Beitrag 1131463)
Anschließend wird per Delphi ein Datensatz erzeugt in dem nur das Feld "test1" gefüllt wird:
Code:
  AdsTAble1.Insert;
  adsTable1.FieldByName('test1').asstring := 'value';
  AdsTAble1.Post;

...und wenn die Option nicht gesetzt ist, wird genau hier jeder Leerstring in NULL umgewandelt.

Bernhard Geyer 20. Okt 2011 12:32

AW: Advantage Database - Null-Werte
 
Zitat:

Zitat von joachimd (Beitrag 1131483)
...und wenn die Option nicht gesetzt ist, wird genau hier jeder Leerstring in NULL umgewandelt.

Und spätestens hier sollte es krachen wenn für das Feld "NOT NULL" definiert ist.
Also wäre dann hier ein Fehler im DBMS vorhanden.

Und wenn das Eintragen erfolgreich wäre müsste es sich doch auch in der Data Architect-Abfrage zeigen.

joachimd 20. Okt 2011 13:07

AW: Advantage Database - Null-Werte
 
mal 'ne dumme Frage: was ist denn der Tabellentyp?

bwolf 20. Okt 2011 13:57

AW: Advantage Database - Null-Werte
 
Hi,

der Tabellentyp ist ADT.

bwolf 26. Okt 2011 18:51

AW: Advantage Database - Null-Werte
 
Hi Joachim,

konntest du das Problem nachvollziehen?
Danke für die Info!

joachimd 26. Okt 2011 21:46

AW: Advantage Database - Null-Werte
 
Zitat:

Zitat von bwolf (Beitrag 1132703)
Hi Joachim,
konntest du das Problem nachvollziehen?

Hab's nicht probiert;)
Ich sträube mich dagegen, Beispiele anhand von ein paar Zeilen nachzuvollziehen, da ich mit an Sicherheit grenzender Wahrscheinlichkeit mindestens eine Eigenschaft, Codezeile o.ä. anders habe und damit solche Fehler nicht auftauchen. Das Ganze kostet unnötig Zeit und Zeit ist das kostbarste Gut, das es gibt und sollte daher nicht verschwendet werden.
Aber Du kannst mir gerne ein fertiges Beispiel schicken und ich debugge es durch und bestätige entweder einen Bug oder schicke Dir eine Anleitung/Fix wie Du das Problem umgehst;)

bwolf 27. Okt 2011 08:17

AW: Advantage Database - Null-Werte
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

ja klar das kann ich verstehen.

Ich habe mal ein Beispiel vorbereitet mit dem man das hoffentlich schnell nachstellen kann.
In dem angehängten Archiv befindet sich ein SQL-Statement zum erzeugen der notwendigen Tabelle und eine kleine Delphi-Anwendung die selbsterklärend sein sollte.
Die verwendeteten Komponenten sollten alle in der Default-Konfiguration sein, es wurden keine Properties verändert.

Danke nochnmals für deine Hilfe!

joachimd 27. Okt 2011 14:11

AW: Advantage Database - Null-Werte
 
Zitat:

Zitat von bwolf (Beitrag 1132767)
Ich habe mal ein Beispiel vorbereitet mit dem man das hoffentlich schnell nachstellen kann.

Liegt nicht an Unicode, sondern daran, dass das eine ein VARCHAR (bzw nVARCHAR) ist, also einem Memo gleichzusetzen und somit nach dem string abgeschnitten wird - bei '' also wirklich nichts beinhaltet. Das andere ist ein CHAR-Feld (dasselbe auch mit NCHAR), welches immer zur gesamten Länge mit Leerzeichen aufgefüllt wird. Das gleichzustellen, musst Du etwas in der Länge>0 auch in das Memo reinschreiben (zB SPACE(5)).
Die NOT NULL Eigenschaft sagt nur aus, dass was drinsteht - der String selbst wird aber abgeschnitten und damit NULL für Delphi.

bwolf 2. Nov 2011 10:24

AW: Advantage Database - Null-Werte
 
Ah ok vielen Dank für die Erklärung.
Wäre es nicht trotzdem sinnvoll wenn eine Abfrage mit IS NULL in einem SQL-Statement und die isNull-Funktion der Komponenten das selbe Ergebniss liefern?

Bernhard Geyer 2. Nov 2011 12:13

AW: Advantage Database - Null-Werte
 
Hä? Das ist aber trotzdem falsch implementiert.

Für die DB ist '' <> nil. Und das sollte es auch bei der DB-Zugriffskomponente sein.
Mindestens sollte man das verhalten per Property einstellen können.


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