🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.delphi.bazy-danych
3 messages
3 total messages Started by Trawnik Thu, 04 Aug 2016 10:45
FireDAC, TField.Origin
#82701
Author: Trawnik
Date: Thu, 04 Aug 2016 10:45
15 lines
1521 bytes
Cześć,
Delphi 10.1 Berlin
FDQuery, takie samo zapytanie do wszystkich baz:
select nazwisko_osoby as "Nazwisko osoby" from osoby;

Dla utworzonego obiektu takiej kolumny property TField.Origin przyjmuje 
różne wartości w zależności od silnika bazy:
dla Firebird 2.5.5 TField.Origin = nazwisko_osoby  <-- OK
dla Oracle 11.2.0.4 TField.Origin = "Nazwisko osoby"  <-- ŹLE
dla MS SQL 2005 TField.Origin = [Nazwisko osoby]  <-- ŹLE

Zgodnie z dokumentacją "TField.Origin indicates the name of the field in its 
original database table".
Jakieś sugestie? Wszystkie mile widziane.
Pozdrawiam, 
Re: FireDAC, TField.Origin
#82702
Author: wloochacz
Date: Fri, 05 Aug 2016 12:40
65 lines
3352 bytes
W dniu 2016-08-04 o 12:45, Trawnik pisze:
> Cześć,
> Delphi 10.1 Berlin
> FDQuery, takie samo zapytanie do wszystkich baz:
> select nazwisko_osoby as "Nazwisko osoby" from osoby;
>
> Dla utworzonego obiektu takiej kolumny property TField.Origin przyjmuje
> różne wartości w zależności od silnika bazy:
> dla Firebird 2.5.5 TField.Origin = nazwisko_osoby  <-- OK
W nazwie tej kolumny nie ma spacji, gdyby była byłoby tak samo jak w Oracle.

> dla Oracle 11.2.0.4 TField.Origin = "Nazwisko osoby"  <-- ŹLE
Dobrze.

> dla MS SQL 2005 TField.Origin = [Nazwisko osoby]  <-- ŹLE
I tu też DOBRZE.

Pojechałeś trochę za daleko - po pierwsze kto normalny wkłada spacje do 
nazwy obiektów w bazie danych?
Da się, ale...

A po drugie - jak już masz tę spację, to jak sobie wyobrażasz napisanie 
SQL z taką kolumną bez użycia kwalifikatora identyfikatora?
Takie zapytanie nie przejdzie z oczywistych względów:
select * from tab
order by Nazwisko osoby

ale takie:
select * from tab
order by [Nazwisko osoby] jest prawidłowe dla MSSQL. Dla Oracle/FB 
będzie to podwójny cudzysłów.


> Zgodnie z dokumentacją "TField.Origin indicates the name of the field in
> its original database table".
No i to jest ZGODNE z tym co jest napisane.
A napisane masz "name of the field in its original database table" a nie 
w SelectSQL, prawda?
Prawda.

Jak masz spację w nazwach, to masz kłopot.

> Jakieś sugestie? Wszystkie mile widziane.
> Pozdrawiam,
Sugestia jest taka, że nie da rady tego zrobić bo tak działa FireDAC i 
koniec.
Dawno temu dyskutowałem na ten temat z Dymitrym i dowiedziałem się, że 
się nie da, bo ta informacja jest wykorzystywana przez 
SQLCommandGenerator i jak wpiszesz tam... wróć - zapędziłem się. Nie o 
to pytałeś :)

A więc sugestia jest taka: NIE UŻYWAJ SPACJI.

A nie wiem czy wiesz, ale żeby takie zapytanie poprawnie odpalić w 
FireDAC na różnych bazach danych (bo różne silniki wymagają różnych 
kwalifikatorów dla identyfikatora) musisz je odpowiednio zapisać w 
FireDAC, czyli tak:

select * from tab
order by {id Nazwisko osoby}

Poza tym, wszystko jest w dokumentacji...

-- 
wloochacz
Re: FireDAC, TField.Origin
#82703
Author: Jurek
Date: Fri, 05 Aug 2016 21:19
98 lines
4262 bytes
Użytkownik "wloochacz" <wloochacz@no.spam.gmail.com> napisał w wiadomości 
news:57a48955$0$15206$65785112@news.neostrada.pl...
>W dniu 2016-08-04 o 12:45, Trawnik pisze:
>> Cześć,
>> Delphi 10.1 Berlin
>> FDQuery, takie samo zapytanie do wszystkich baz:
>> select nazwisko_osoby as "Nazwisko osoby" from osoby;
>>
>> Dla utworzonego obiektu takiej kolumny property TField.Origin przyjmuje
>> różne wartości w zależności od silnika bazy:
>> dla Firebird 2.5.5 TField.Origin = nazwisko_osoby  <-- OK
> W nazwie tej kolumny nie ma spacji, gdyby była byłoby tak samo jak w 
> Oracle.
>
>> dla Oracle 11.2.0.4 TField.Origin = "Nazwisko osoby"  <-- ŹLE
> Dobrze.
>
>> dla MS SQL 2005 TField.Origin = [Nazwisko osoby]  <-- ŹLE
> I tu też DOBRZE.
>
> Pojechałeś trochę za daleko - po pierwsze kto normalny wkłada spacje do 
> nazwy obiektów w bazie danych?
> Da się, ale...
>

Przeczytaj dokładnie:
- w bazie kolumna ma nazwę nazwisko_osoby - bez spacji
- "Nazwisko osoby" to alias kolumny nazwisko_osoby w poleceniu select

Dla wszystkich baz, w obiekcie TField dla tej kolumny, powinno być:
TField.FieldName = Nazwisko osoby - bez ozdobników "..." czy [...] - i tak 
jest!!!
TField.Origin = nazwisko_osoby - i tak jest tylko dla FB

> A po drugie - jak już masz tę spację, to jak sobie wyobrażasz napisanie 
> SQL z taką kolumną bez użycia kwalifikatora identyfikatora?
> Takie zapytanie nie przejdzie z oczywistych względów:
> select * from tab
> order by Nazwisko osoby
>

przejdzie order by nazwisko_osoby bo to jest nazwa kolumny w bazie

> ale takie:
> select * from tab
> order by [Nazwisko osoby] jest prawidłowe dla MSSQL. Dla Oracle/FB będzie 
> to podwójny cudzysłów.
>

to też przejdzie :)

>
>> Zgodnie z dokumentacją "TField.Origin indicates the name of the field in
>> its original database table".
> No i to jest ZGODNE z tym co jest napisane.
> A napisane masz "name of the field in its original database table" a nie w 
> SelectSQL, prawda?
> Prawda.
>
> Jak masz spację w nazwach, to masz kłopot.

Patrz wyżej. Nazwa kolumny w bazie nie ma spacji.

>> Jakieś sugestie? Wszystkie mile widziane.
>> Pozdrawiam,
> Sugestia jest taka, że nie da rady tego zrobić bo tak działa FireDAC i 
> koniec.
> Dawno temu dyskutowałem na ten temat z Dymitrym i dowiedziałem się, że się 
> nie da, bo ta informacja jest wykorzystywana przez SQLCommandGenerator i 
> jak wpiszesz tam... wróć - zapędziłem się. Nie o to pytałeś :)

Bingo!! Właśnie w celu wygenerowania polecenia do bazy winno służyć 
TField.Origin, ale z tym co tam aktualnie jest umieszczane nie da się tego 
zrobić.

> A więc sugestia jest taka: NIE UŻYWAJ SPACJI.

nie użyłem

>
> A nie wiem czy wiesz, ale żeby takie zapytanie poprawnie odpalić w FireDAC 
> na różnych bazach danych (bo różne silniki wymagają różnych kwalifikatorów 
> dla identyfikatora) musisz je odpowiednio zapisać w FireDAC, czyli tak:
>
> select * from tab
> order by {id Nazwisko osoby}

wiem, ale to inna bajka

>
> Poza tym, wszystko jest w dokumentacji...

bez komentarza

>
> -- 
> wloochacz 
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads