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

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.

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

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.

0

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

SET NAMES 'UTF-8';

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:=@gt;
      DataSet.Fields[i].OnSetText:=@st;
    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

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