Wpisanie danych do bazy z pliku CSV

0

Witam serdecznie, próbuję stworzyć program umożliwiający wczytanie do bazy postgesql danych z pliku csv. poniżej zamieszczam fragment kodu:

procedure TForm1.Button4Click(Sender: TObject);
var
  txt: TextFile;
  tekst: TStringList;
  arg: string;
begin
  if application.messagebox('Czy na pewno wczytać ten plik?', 'Uwaga!', mb_yesno + mb_iconquestion + mb_defbutton2) = IDYES then
  begin
    tekst := TStringList.Create;
    AssignFile(txt, labelededit1.text);
    Reset(txt);
    ProgressBar1.Position := 0;
    ProgressBar1.Max := filesize(txt);
    while not Eoln(txt) do
    begin
      tekst.Clear;
      Readln(txt, arg);
      ExtractStrings([';'], [], PChar(arg), tekst);
      with ZQuery1 do
      begin
        SQL.Clear;
        SQL.Add('insert into pasazer(imie, nazwisko, ulica, kod_pocztowy, miasto,pesel, id_zakladu, id_wydzialu) values (:imie,:nazwisko,:ulica,:kod_pocztowy,:miasto,:pesel,:id_zakladu,:id_wydzialu)');
        ParamByName('IMIE').AsString := (tekst.Strings[0]);
        ParamByName('nazwisko').AsString := (tekst.Strings[1]);
        ParamByName('ulica').AsString := (tekst.Strings[2]);
        ParamByName('kod_pocztowy').AsString := (tekst.Strings[3]);
        ParamByName('miasto').AsString := (tekst.Strings[4]);
        ParamByName('pesel').AsString := (tekst.Strings[5]);
        ParamByName('id_zakladu').ASinteger := StrToInt(LabeledEdit2.Text);
        ParamByName('id_wydzialu').ASinteger := StrToInt(LabeledEdit3.Text);
        ExecSQL;
      end;
      ProgressBar1.Position := ProgressBar1.Position + 1;
    end;
  end;
  CloseFile(txt);
  ProgressBar1.Position := 0;
  tekst.Free;
  ShowMessage('!! wczytano dane z pliku !!');
  ZConnection1.Connected := True;
  ZQuery1.active := True;
  ZQuery1.SortedFields := 'id_wydzialu,nazwisko,imie';
  Label7.Caption := IntToStr(DataSource1.DataSet.RecordCount)

praktycznie działa: ale mam dwie sprawy:

  1. po zakończeniu procedury wczytywania danych wyskakuje błąd jak z załączniku i nie wyświetla mi wczytanych danych,
  2. pgadmin pokazuje, ze dane zostały wczytane i zapisane.
    proszę o pomoc w rozwiązaniu tego "mojego" problemu.
0

Wygląda to tak, jakbyś nie miał w datasecie zdefiniowanego pola id_wydzialu. Pamiętaj, że dataset to coś jednak innego niż grid.

0

Dodajesz rekordy do bazy używając komponentu zquery1, do wyświetlenia danych z tabeli też korzystasz z tego samego komponentu, ale nie ustawiasz mu odpowiedniego sqla, przed próbą otwarcia,

 ...
 CloseFile(txt); 
ProgressBar1.Position := 0;
 tekst.Free; ShowMessage('!! wczytano dane z pliku !!'); 
ZConnection1.Connected := True; 
Zquery1.sql.text:='select * from pasazer'; //tutaj musisz wstawić prawidłowego selecta
ZQuery1.active := True;
 ZQuery1.SortedFields := 'id_wydzialu,nazwisko,imie'; 
Label7.Caption := IntToStr(DataSource1.DataSet.RecordCount)
0

dziękuję bardzo, wszystko działa w najlepszym porządku.

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