Results 1 to 8 of 8

Thread: dbExpress lege string naar NULL

  1. #1
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382

    dbExpress lege string naar NULL

    Is er ergens een manier om ervoor te zorgen dat een clientdataset (string) veld NULL wordt als de string leeg is?
    Of moet dat altijd geprogrammeerd worden, bijvoorbeeld in de BeforePost?

  2. #2
    Hangt een beetje van je dataset en gebruikte field-classes af. Bijvoorbeeld de IBX (die ik gebruik) heeft een TIBStringField met het volgende:

    Delphi Code:
    1. type
    2.   TIBStringField = class(TWideStringField)
    3.   private
    4.     buffer : TValueBuffer;
    5.     FEmptyAsNull: Boolean;
    6.   public
    7.     constructor Create(AOwner: TComponent); override;
    8.     destructor Destroy; override;
    9.     class procedure CheckTypeSize(Value: Integer); override;
    10.     function GetAsString: string; override;
    11.     function GetAsVariant: Variant; override;
    12.     function GetValue(var Value: string): Boolean;
    13.     procedure SetAsString(const Value: string); override;
    14.     property Value: UnicodeString read GetAsWideString write SetAsWideString;
    15.   published
    16.     property EmptyAsNull : Boolean read FEmptyAsNull write FEmptyAsNull default true;
    17.   end;

    Daar zie je dus een EmptyAsNull staan die default true is.
    Ik geloof ook dat deze discussie voor de IBDAC van DevArt gevoerd is.

    Welke componenten gebruik je precies?

  3. #3
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    MS SQL Server + DbExpress + TSQLDataSet + TClientDataSet.
    TStringField heeft de property niet. Toch vreemd, want zou dit eigenlijk als standaard gedrag verwachten.
    De database van het programma dat ik onderhoud zit dan ook vol met '' velden i.p.v. NULL velden :-(

  4. #4
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Ik heb dat "Probleem" in het verleden ook eens gehad (ook met strings als " ", dus ook eigenlijk leeg) en
    dat heb ik toen ook maar opgelost met een OnBeforePost-achtige constructie, omdat ik er verder niet veel
    energie meer in wilde stoppen.
    TMemoryLeak.Create(Nil);

  5. #5
    Of iets in de EditChange van je TDBEdit.
    (dit moest ik doen om ook velden met een EditMask goed op NULL te kunnen zetten)

    Delphi Code:
    1. if (Sender is TDBEdit) then
    2.   with TDBEdit(Sender) do
    3.   begin
    4.     if Modified then
    5.     begin
    6.       // ModifiedForm:=true;
    7.       if (Text = '') or (Text = FormatMaskText(Field.EditMask, '')) then
    8.       begin
    9.         Field.Clear;
    10.         Modified := false;
    11.       end;
    12.     end;
    13.   end;

    Je zou het op NULL zetten zelfs in je TField.OnSetText kunnen doen.

  6. #6
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    @Rvk: too many events already...
    @VideoRipper: same here...
    Het meest globaal zou een interceptor class zijn om dit soort dingen te regelen.
    Om alle designtime clientdatasets om de tuin te leiden :-)

  7. #7
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Volgens mij heb ik ooit ook eens iets opgelost op SQL-niveau.
    Iets in de trant van:
    SQL Code:
    1. INSERT INTO Adressen
    2. (
    3.   Woonplaats
    4. )
    5. VALUES
    6. (
    7.   NULLIF(RTRIM(LTRIM(:WoonPlaats)), '')
    8. )
    TMemoryLeak.Create(Nil);

  8. #8
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Vooralsnog dus nu in de BeforePost gezet.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •