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?
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ęki, pomogło :)
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"
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:
Możecie mi pomóc, podpowiedzieć co powinienem zrobić ?
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://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).
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 ?
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);
A w postaci
SqlQuery.FieldByName('NazwaPola').AsString
też jest odczytywane bezpośrednio z bazy, a nie przez DataSet? Pytam, bo nigdy nie sprawdzałem ;)
To Działa :).
Pociech SqlQuery.FieldByName.AsString działa tak jak SqlQuery.Fields[x].AsString więc również leci bezpośrednio z bazy.
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
@Pawelper utf8tocp1250() ;)
hipekk napisał(a):
@Pawelper utf8tocp1250() ;)
Oczywista oczywistość :D, tylko w którym miejscu ją wpisać ;)
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
dla ustawiania wartości w OnSetText wpisujesz:
Sender.AsString:=UTF8ToCP1250(aText);
jeżeli chodzi Ci o edycję danych w gridzie
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 :)
Przystawiło mi na polach memo. Działa na stingach
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.