Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


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