Czy TDataSet sam obcina białe znaki z pola typu Varchar2

0

Witajcie,

Mam pytanie w projekcie mamy sytuację, że w tabeli oracle jest pole typu varchar2(15) i jest wartość: '0123456789 '. Nie pytajcie błagam dlaczego tak, dlaczego nie ma pola typu CHAR, skąd te spacje itd ... przyjmijcie na wiarę, że taki [CIACH!] zastałem i nie mam siły przebicia aby to zmienić. Sęk w tym, że komponenty bazodanowe gdy robimy selecta do tej tabeli obcinają same te białe znaki w efekcie Length(dsName.FieldByName('PoleZDB').AsString) zwraca 10 zamiast 15 mimo iż ten sam length na bazie zwraca 15. Niestety nie mam możliwości sprawdzenia tego na innym delphi (pracujemy na D5) i starych komponentach firmy Comarch i nie mam pojęcia skąd ten trim ... mało tego niektórzy developerzy twierdzą, że to wina samego VCL. Pytanie do was czy spotkaliście się z takim zachowaniem np ADO lub Firedac?

0

jeśli do pola ktoś wpisał 1234567890 (z JEDNĄ spacją na końcu) to w takim polu jest 1234567890 (z JEDNĄ spacją na końcu) i koniec. NIGDY samo z siebie nie będzie tam 1234567890 , NIGDY samo się też nie zrobi 1234567890 (bez spacji na końcu). A Length podaje rozmiar WPROWADZONEGO tam tekstu a nie maksymalny dozwolony rozmiar tekstu do wprowadzenia. Tak działa pole VARCHAR w KAŻDEJ bazie i tym się różni od pola CHAR, że się nie uzupełnia spacjami do rozmiaru pola SAMO. Ale to jest przecież podstawowa wiedza z baz danych...

0
Testuser napisał(a):

Witajcie,

Mam pytanie w projekcie mamy sytuację, że w tabeli oracle jest pole typu varchar2(15) i jest wartość: '0123456789 '. Nie pytajcie błagam dlaczego tak, dlaczego nie ma pola typu CHAR, skąd te spacje itd ... przyjmijcie na wiarę, że taki [CIACH!] zastałem i nie mam siły przebicia aby to zmienić.

No to dalej będzie pierd0lnik...

Sęk w tym, że komponenty bazodanowe gdy robimy selecta do tej tabeli obcinają same te białe znaki w efekcie Length(dsName.FieldByName('PoleZDB').AsString) zwraca 10 zamiast 15 mimo iż ten sam length na bazie zwraca 15.

Znaczy, te wasze super-inteligentne komponenty same robią trima i to jeszcze wychodzi na to, ze zawsze to robią.
Albo dlatego, ze ktoś je tak ustawił, albo tak robią i koniec.

To obcinanie oczywiście ma sens, ale tylko dla pól typu fixed (ftFixedChar, ftFixedWideChar) czyli w bazie to będzie char a nie varchar.

Niestety nie mam możliwości sprawdzenia tego na innym delphi (pracujemy na D5) i starych komponentach firmy Comarch

Comarch robił jakieś komponenty dla Delphi?
Jakie?
Jeśli to jakoś analogiczny twór do struktury (a bardziej do obiektów programowalnych - czysta masakra...) bazy danych w ich sztandarowym ich produkcie, to faktycznie pierd0lnik...

i nie mam pojęcia skąd ten trim ...

Wyżej pisałem...
No można to zrobić jeszcze obsługując zdarzenie TField.OnGetTex dla danego pola w TDataSet.

mało tego niektórzy developerzy twierdzą, że to wina samego VCL.

Bzdury gadają, ponieważ w standardowym VCL nie jest to w ogóle dotykane.
Tekst jest serwowany z bazy as-is, pod kątem białych znaków.

Pytanie do was czy spotkaliście się z takim zachowaniem np ADO lub Firedac?

FireDAC ma taką opcję:
http://docwiki.embarcadero.com/Libraries/Tokyo/en/FireDAC.Stan.Option.TFDFormatOptions.StrsTrim
Ale to nie działa dla pól typu VarChar!

Standardowe komponenty ADO (vel dbGO) takiej opcji nie posiadało.

0

Dzięki @wloochacz potwierdziłeś to co podejrzewałem, że te komponenty bazodanowe z comarcha coś psocą...
co do samych komponentów to jest to coś takiego:

// Comarch TDataSet
  TcaDataSet = class(TOracleDataSet)
1
Testuser napisał(a):

Dzięki @wloochacz potwierdziłeś to co podejrzewałem, że te komponenty bazodanowe z comarcha coś psocą...
co do samych komponentów to jest to coś takiego:

// Comarch TDataSet
  TcaDataSet = class(TOracleDataSet)

Jeśli to jest to co myślę, to naprawdę słabo...
Ale do brzegu; TOracleDataSet to jest Direct Oracle Access (a nie żaden Comarch...)
No to szukamy dokumentacji, którą znajdujemy w 5s:
https://www.allroundautomations.com/download/doamanual.pdf

A tam na stronie 37 stoi jak wół:

property TrimStringFields: Boolean;
// Remove trailing spaces from TOracleDataSet fields when fetching varchar2 and char columns
// from the database. These trailing spaces usually just get in the way when modifying string
// fields, so this property is True by default.

A więc ustaw to sobie na False i nie będziesz miał obcinanych spacji.
A przy okazji pozdrów ode mnie niektórych developerów...

0

...
fixing the lookup/calc TWideStringField problem with TOracleDataSet

0
satq napisał(a):

...
fixing the lookup/calc TWideStringField problem with TOracleDataSet

Ale powiedz - na pewno oglądałeś ten film)?
Proponujesz pytaczowi rejestrację nowego pola, które będzie robiło... no własnie co ma robić?
Pytam bo nie rozumiem co ten film ma do tematu wątku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1