Lazarus+ODBC+MS SQL Polskie znaki

0

Niedawno zainteresowałem się środowiskiem Lazarus (nie ma w tej chwili żadnej darmowej wersji Delphi bezpośrednio obsługującej bazy danych). Napisałem sobie mały testowy programik łączący się z bazą MS SQL przy pomocy ODBC. Okazuje się, że zamiast polskich znaków w DBGrid pokazują się pytajniki. Gdzie szukać problemu?

3

dzieje się tak z powodu różnych kodowań, lazarus obsługuje UTF8, a bazę zapewne masz w cp1250.
aby to rozwiązać we wszystkich polach dataset'u (sqlquery) typu string, w zdarzeniu OnGetText dodaj coś takiego:

aText:=CP1250ToUTF8(Sender.AsString);

oczywiście do modułów musisz dodać LConvEncoding.

0

Dzięki, pomogło :)

0
Paweł Dmitruk napisał(a):

we wszystkich polach dataset'u (sqlquery) typu string, w zdarzeniu OnGetText dodaj coś takiego:

aText:=CP1250ToUTF8(Sender.AsString);

oczywiście do modułów musisz dodać LConvEncoding.

możecie mi to bardziej łopatologicznie wyjaśnić ?


EDIT:

Próbuje znaleźć info czym właściwie jest "dataset", ale nic konkretnego nie wyczytałem...
To jakiś komponent (jeśli tak to go u siebie nie mogę zidentyfikować....)?


EDIT:
Znalazłem dataset w zdarzeniach DataSource - chyba o to chodziło ?
Jednak nie mam w nim zdarzenia OnGetText...
Eksperymentalnie wstawiłem

aText:=CP1250ToUTF8(Sender.AsString);

w zdarzenie OnNewRecord -> otrzymałem dwa błędy:

unit1.pas(324,6) Error: Identifier not found "aText"
unit1.pas(324,27) Error: Identifier not found "Sender"
0

Znalazłem w sieci wskazówkę ab wstawic w kodzie:

SQLQuery1.SQL.Text := 'set names ' + #39 + 'utf8' + #39;
   SQLQuery1.ExecSQL;        
    SQLTransaction1.Commit;  
    SQLQuery1.Close;  
 

Jednak wtedy otrzymuje błąd:
user image

Możecie mi pomóc, podpowiedzieć co powinienem zrobić ?

0
hipekk napisał(a):
Paweł Dmitruk napisał(a):

we wszystkich polach dataset'u (sqlquery) typu string, w zdarzeniu OnGetText dodaj coś takiego:

aText:=CP1250ToUTF8(Sender.AsString);

oczywiście do modułów musisz dodać LConvEncoding.

możecie mi to bardziej łopatologicznie wyjaśnić ?

Już bardziej łopatologicznie to trudno będzie. Klikasz 2x na swój DataSet - otworzy się lista pól tego DataSet'u. Wybierasz odpowiednie pole i w Object Inspectorze masz dostęp do jego właściwości i zdarzeń. Znajdujesz zdarzenie OnGetText, klikasz na nim 2x i w kodzie zdarzenia dopisujesz tę 1 linijk e, o której tutaj jest mowa.

Co do tego, czym jest DataSet:

http://etutorials.org/Programming/mastering+delphi+7/Part+III+Delphi+Database-Oriented+Architectures/Chapter+13+Delphi+s+Database+Architecture/The+DataSet+Component/

http://podgoretsky.com/ftp/Docs/Delphi/D5/dg/5_datset.html

Niestety nie znalazłem na szybko niczego ładnie opisanego po polsku (może kiepsko szukałem).

0

Dzięki uprzejmości Pociech'a udało mi się zmienić kodowanie, jednak pojawił się nowy problem...
Po zmianie kodowania na UTF8 dane w DbGrid wyświetlają się poprawnie jednak przy użyciu np SqlQuery2.Fields[0].AsString; skopiowany tekst znów ma "?" zamiast polskich liter...
Czemu tak się dzieje ?

0

dane

SqlQuery2.Fields[0].AsString

nie są zaciągane przez dataset, tylko bezpośrednio z bazy danych, dla nich kodowanie musisz zmienić ręcznie, np. CP1250ToUTF8(SqlQuery2.Fields[0].AsString);

0

A w postaci

SqlQuery.FieldByName('NazwaPola').AsString

też jest odczytywane bezpośrednio z bazy, a nie przez DataSet? Pytam, bo nigdy nie sprawdzałem ;)

0

To Działa :).

Pociech SqlQuery.FieldByName.AsString działa tak jak SqlQuery.Fields[x].AsString więc również leci bezpośrednio z bazy.

0

A jak zrobić w drugą stronę ?
Czyli z DBGirda zrobić update do bazy zmieniając utf-8 na CP1250 ?

Dzięki z góry :)
Pawelper

0

@Pawelper utf8tocp1250() ;)

0
hipekk napisał(a):

@Pawelper utf8tocp1250() ;)

Oczywista oczywistość :D, tylko w którym miejscu ją wpisać ;)

0
Paweł Dmitruk napisał(a):

dzieje się tak z powodu różnych kodowań, lazarus obsługuje UTF8, a bazę zapewne masz w cp1250.
aby to rozwiązać we wszystkich polach dataset'u (sqlquery) typu string, w zdarzeniu OnGetText dodaj coś takiego:

aText:=CP1250ToUTF8(Sender.AsString);

oczywiście do modułów musisz dodać LConvEncoding.

Dziękuję za ten tekst, bo przepytałem całego google i nie znalazłem podopowiedzi. Natomiast tutaj bardzo precyzyjnie Paweł Dmitruk wyjasnił problem. Drogą analogii myślałem, żę stosując UTF8ToCP1250 do zdarzenia OnSetText przekonwertuję wyedytowaną wartość do bazy. Niestety pojawia się błąd :(. Być może problem jest banalny i pytanie jest lamerskie, ale wybaczcie, bo od tygodnia uczę się Lazarusa i wydaje mi się, że jest fajny :). Chyba, że może w składni zapytania SQL zastosować tę funkcję, jeśli tak to proszę o link do jakiegoś faq.

Dzięki za zainteresowanie
pozdr
Pawel

1

dla ustawiania wartości w OnSetText wpisujesz:

Sender.AsString:=UTF8ToCP1250(aText); 

jeżeli chodzi Ci o edycję danych w gridzie

0
Paweł Dmitruk napisał(a):

dla ustawiania wartości w OnSetText wpisujesz:

Sender.AsString:=UTF8ToCP1250(aText); 

jeżeli chodzi Ci o edycję danych w gridzie

Działa :-D
Dziękuję Dobry Człowieku :)

0

Przystawiło mi na polach memo. Działa na stingach

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