W jaki sposób ustawić kodowanie do odczytu z bazy PostgreSQL?

Odpowiedz Nowy wątek
2015-01-26 14:10
0

Witam w jaki sposób ustawić kodowanie do odczytu z bazy w lazarusie.
Baza to PostgreSQL z kodowaniem

ENCODING = 'WIN1250'
       TABLESPACE = pg_default
       LC_COLLATE = 'Polish_Poland.1250'
       LC_CTYPE = 'Polish_Poland.1250'

a teraz jak i gdzie ustawić takie kodowanie w lazarusie aby odczytać polskie znaki bez pytajników.

@vpiotr Nie lizus tylko ja moderatorem nie jestem :] - babubabu 2015-01-26 16:43
@yaromat - tym razem poprawię tytuł wątku za Ciebie; W następnych przypadkach wątki będą lądować w koszu już bez ostrzeżeń; - furious programming 2015-01-26 18:32

Pozostało 580 znaków

2015-01-26 18:16
1

jeżeli do bazy łączysz się za pomocą komponentu Zeos, to we właściwościach połączenia możesz ustawić autokodowanie znaków. Jeżeli natomiast łączysz się za pomocą standardowych komponentów lazarusa, to dla wszystkich pól tekstowych datasetu w onGetText ustawiasz:

aText:=CP1250ToUTF8(Sender.AsString)

a dla onSetText:

Sender.AsString:=UTF8ToCP1250(aText);

Do sekcji uses musisz dodać LConvEncoding


pozdrawiam
paweld

Pozostało 580 znaków

2015-01-27 12:46
0

Super! działa idealnie, a czy jest jakaś możliwość zrobienia automatu pod standardowe komponenty lazarusa aby do każdej kolumny nie dopisywać tego wyrażenia.

Pozostało 580 znaków

2015-01-27 12:53
gsfdgsfdg
0

spróbuj zaraz po podłączeniu do bazy wysłać zapytanie

SET NAMES 'UTF-8';

Pozostało 580 znaków

2015-01-27 13:21
1
procedure TMainForm.exec(DataSet: TSQLQuery);
var
  i: integer;
begin
  DataSet.SQL.Text:=UTF8ToCP1250(DataSet.SQL.Text);
  for i:=0 to DataSet.Params.Count-1 do
  begin
    if DataSet.Params[i].DataType=ftString then
    DataSet.Params[i].AsString:=UTF8ToCP1250(DataSet.Params[i].AsString);
  end;
  DataSet.ExecSQL;
end;

procedure TMainForm.open(DataSet: TSQLQuery);
var
  i: integer;
begin
  DataSet.SQL.Text:=UTF8ToCP1250(DataSet.SQL.Text);
  for i:=0 to DataSet.Params.Count-1 do
  begin
    if DataSet.Params[i].DataType=ftString then
    DataSet.Params[i].AsString:=UTF8ToCP1250(dataset.Params[i].AsString);
  end;
  DataSet.Open;
  for i:=0 to DataSet.Fields.Count-1 do
  begin
    if DataSet.Fields[i].DataType=ftString then
    begin
      DataSet.Fields[i].OnGetText:[email protected];
      DataSet.Fields[i].OnSetText:[email protected];
    end;
  end;
end;

procedure TMainForm.gt(Sender: TField; var aText: string; DisplayText: Boolean);
begin
  aText:=CP1250ToUTF8(Sender.AsString);
end;

procedure TMainForm.st(Sender: TField; const aText: string);
begin
  Sender.AsString:=UTF8ToCP1250(aText);
end;  

później w kodzie używasz:

open(Query1); //zamiast: Query1.Open;
//lub
exec(Query1); //zamiast Query1.ExecSQL;

oczywiście jak chcesz pobrać wartość pola do edita to:

edit1.Text:=Query1.FieldByName('nazwa').Text; //a nie Query1.FieldByName('nazwa').AsString;

a jak przekazujesz parametry to:

Query1.ParamByName('nazwa').Text:='abc'; //zamiast Query1.ParamByName('nazwa').AsString

pozdrawiam
paweld

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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