SQL+INSERT+premenna typu integer

Sekcia: Programovanie 30.04.2008 | 00:31
Avatar djway UBUNTU 8.10  Používateľ
Zdravim, potreboval by som pomoc. Programujeme v skole databazovu aplikaciu v Delphi. Potrebujem spravit autoincrement v tabulke. Kod ako ho spravit som nasiel, s tym problem nie je. Ale mam problem, lebo ho neviem do tabulky zapisat. Vlastne vobec v SQL v Delphi neviem zapisat ziadnu premennu typu integer/short do tabulky (v tabulke mam typ short). Pomozte mi prosim ako sa zapisuje premenna ineho typu ako je string.

Toto ide:
Query1.SQL.Add('SELECT m.Mesto FROM mesto m WHERE(m.Mesto LIKE ''Kosice'')');
Ale chcem nieco take:
Query1.SQL.Add('SELECT m.ID_Mesto FROM mesto m WHERE(m.ID_Mesto=?)');
Tu som dal SELECT, ale ide mi o princip, ako zapisat namiesto ? premennu typu integer. Dakujem.
    • Re: SQL+INSERT+premenna typu integer 30.04.2008 | 00:40
      WlaSaTy   Návštevník
      between -9 and 9
      • Re: SQL+INSERT+premenna typu integer 30.04.2008 | 00:50
        Avatar djway UBUNTU 8.10  Používateľ
        no ale to -9 a 9 tam nechcem mat, potrebujem to mat v premennych napr.: between a and b, pricom a ,b su integer...
        • Re: SQL+INSERT+premenna typu integer 30.04.2008 | 00:57
          WlaSaTy   Návštevník
          Presnejsia syntax zavisi od pouziteho engine, napriklad ProC od Oracle by pouzilo "between a: and b:". Uz asi vies co urcuje dvojbodka za nazvom premennej pre preprocessor daneho jazyka.
          • Re: SQL+INSERT+premenna typu integer 30.04.2008 | 01:03
            Avatar djway UBUNTU 8.10  Používateľ
            bohuzial neviem, ale nemusime sa bavit o a ,b, staci mi tam jedna premenna, netreba between, treba mi tam napriklad iba premennu a namiesto ?. Ale Delphi mi to nepapa, napriklad take nieco spapa:
            mesto.Mesto LIKE ''%'+a+'%'' , kde a je premenna typu string... ale takto nejak tam potrebujem zapisat a ako premennu typu integer, skusal som rozne kombinacie, vzdy neuspesne alebo s chybou, tak asi na to musi byt nejaky specialny zapis...
            • Re: SQL+INSERT+premenna typu integer 30.04.2008 | 01:42
              WlaSaTy   Návštevník
              Nie, nie je na to specialny zapis, pokial ovsem nepouzivas nejaky problematicky komponent ktory skoncil svoju zivotnu put pred tym ako sa piesok lial a voda sypala. inak odporucam zaklady sql a plsql. to between je spravne, cisla nepoznaju wildchar "?".
            • Re: SQL+INSERT+premenna typu integer 30.04.2008 | 02:40
              shade   Návštevník
              A skusil si tu premennu typu int najprv skonverotavat na string?
              • Re: SQL+INSERT+premenna typu integer 30.04.2008 | 03:35
                Avatar djway UBUNTU 8.10  Používateľ
                Asi to budem musiet robit presne tak, ze v tabulke budem mat stringy a stale pri vybere pretypujem, spravim, co treba a potom zasa pretypujem a zapisem... ale to sa idem skrabat lavou rukou za pravym uchom... komponentu pouzivam TQuery [dbTables]... Myslel som, ze to pojde aj jednoduchsie, v PHP to nie je problem spravit a v delfinovi, katastrofa... A ucitel, ktory uz mal byt 10 rokov mrtvy vie z toho hovno, ale naroky ma nenormalne... Ale to je takto asi na kazdej skole, cest vynimkam.
    • Re: SQL+INSERT+premenna typu integer 30.04.2008 | 10:26
      Avatar Zefram Cochrane MS Windows Vista Ultimate 64bi  Používateľ
      Query1.Sql.Add('SELECT m.ID_Mesto FROM mesto m WHERE m.ID_Mesto=:MESTO and ulica=:ULICA';
      Query1.ParamByName('MESTO').AsInteger := 123;
      Query1.ParamByName('ULICA').AsString := 'Nejaka ''drop table users;'' ulica';
      Query1.Open;
      ...
      

      ParamByName je bezpecne aj proti sql injection
    • Re: SQL+INSERT+premenna typu integer 30.04.2008 | 10:38
      Avatar Zefram Cochrane MS Windows Vista Ultimate 64bi  Používateľ
      Samozrejme prasce mozu narabat priamo zo stringami:
      meno := 'Jan*';
      iq := 100;
      Query1.Sql.Text := 'select * from users where meno like "'+meno+'" and iq >= '+IntToStr(iq);
      

      Alebo mozes pouzit funkciu Format:
      Query1.Sql.Text := Format('select * from users where meno like "%s" and iq >= %d",[meno,iq]);
      

      Tento kod narozdiel od ParamByName nie je odolny proti SQL injection takze na stringy by sa to nemalo pouzivat, na integre to ale pouzivam bezne. Pred kazdym naplnanim selectu ak ides cez Add() nezabudni na Sql.Clear;

      Ked ti to nejde do dbgridu tak zrejme budes potrebovat cosi ako:
      Query1.Sql.Text := 'select * from users';
      Query1.Open;
      while not Query1.Eof do
      begin
        Memo1.Lines.Add(Query1.FieldByName('meno').AsString+' ma iq '+Query1.FieldByName('iq').AsString);
        Query1.Next; // velmi dolezite, casta chyba je zabudnut to
      end;
      

      Na zapisovanie do databazy pouzivaj ale radsej table lebo ked nieco ulozis tak obvykle chces vediet serial toho co si vlozil a na to je jednotny sposob len cez TTable. Spravis Table1.Post a potom znova pozries stlpec ktory si zapisal do IndexFieldNames.
      • Re: SQL+INSERT+premenna typu integer 02.05.2008 | 23:24
        Avatar djway UBUNTU 8.10  Používateľ
        diky, strasne si mi pomohol, ale este by som potreboval poradit ako vytiahnut konkretnu hodnotu ID_Mesto z tabulky mesto, ja vlastne potrebujem vytiahnut z tabulky mesto ID_Mesto a potom to zapisat do tabulky zakaznici do ID_Mesto.
        ...
        a:=Query1.SQL.Add('SELECT ID_Mesto FROM mesto WHERE Mesto:='''+Edit3.Text+''')');
        Query1.SQL.Add('INSERT INTO zakaznik (Priezvisko_a_Meno,Ulica,,ID_Mesto) VALUES ("'+Edit1.Text+'","'+Edit2.Text+'",'+IntToStr(a)+') ' );
        ...

        teoreticky nieco take, samozrejme je v tom chyba, da sa takto do premennej a priradit select? vyhadzuje mi to chyby... ako to mam napisat?
        • Re: SQL+INSERT+premenna typu integer 02.05.2008 | 23:58
          Avatar Zefram Cochrane MS Windows Vista Ultimate 64bi  Používateľ
          // najdeme serial mesta
          Query1.Sql.Text := 'SELECT ID_Mesto FROM mesto WHERE Mesto=:MESTO';
          Query1.ParamByName('MESTO').AsString := Edit3.Text;
          Query1.Open;
          a := Query1.FieldByName('ID_Mesto').AsInteger;
          
          // zapis do zakaznik
          Query1.Sql.Text := 'INSERT INTO zakaznik (Priezvisko_a_Meno,Ulica,ID_Mesto) VALUES (:MENO,:ULICA,:MESTO)';
          Query1.ParamByName('MENO').AsString := Edit1.Text;
          Query1.ParamByName('ULICA').AsString := Edit2.Text;
          Query1.ParamByName('MESTO').AsInteger := a;
          Query1.ExecSql;
          • Re: SQL+INSERT+premenna typu integer 03.05.2008 | 00:03
            Avatar Zefram Cochrane MS Windows Vista Ultimate 64bi  Používateľ
            alebo:
            with Query1, Query1.Sql do
            begin
              // najdeme serial mesta
              Text := 'SELECT ID_Mesto FROM mesto WHERE Mesto=:MESTO';
              ParamByName('MESTO').AsString := Edit3.Text;
              Open;
              a := FieldByName('ID_Mesto').AsInteger;
            
              // zapis do zakaznik
              Text := 'INSERT INTO zakaznik (Priezvisko_a_Meno,Ulica,ID_Mesto) VALUES (:MENO,:ULICA,:MESTO)';
              ParamByName('MENO').AsString := Edit1.Text;
              ParamByName('ULICA').AsString := Edit2.Text;
              ParamByName('MESTO').AsInteger := a;
              ExecSql;
            end;
            • Re: SQL+INSERT+premenna typu integer 03.05.2008 | 00:24
              Avatar djway UBUNTU 8.10  Používateľ
              procedure TForm1.Button14Click(Sender: TObject);
              var a,b:short;
              begin
              Query1.Active:= False;
              Query1.SQL.Clear;
              Query1.Sql.Text := 'SELECT ID_Mesto FROM mesto WHERE Mesto=:MESTO';
              Query1.ParamByName('MESTO').AsString := ComboBox1.Text;
              Query1.Open;
              a:=Query1.FieldByName('ID_Mesto').AsInteger;
              b:=6;
              Query1.Sql.Text := 'INSERT INTO zakaznik (Priezvisko_a_Meno,Ulica,ID_Zakaznik,ID_Mesto) VALUES (:MENO,:ULICA,:ZAKAZNIK,:MESTO)';
              Query1.ParamByName('MENO').AsString := Edit4.Text;
              Query1.ParamByName('ULICA').AsString := Edit5.Text;
              Query1.ParamByName('ZAKAZNIK').AsInteger := b;
              Query1.ParamByName('MESTO').AsInteger := a;
              Query1.ExecSql;
              end;

              Mam to takto a mi vypisuje Type mismatch in expression...
            • Re: SQL+INSERT+premenna typu integer 03.05.2008 | 13:55
              Avatar djway UBUNTU 8.10  Používateľ
              no ok, nejak som to poriesil, sice nie nejak kvalitne, ale aspon mi to funguje, dalej sa uz snad vysomarim sam, este raz velmi pekne dakujem ;-)
    • Re: SQL+INSERT+premenna typu integer 04.05.2008 | 20:37
      Avatar djway UBUNTU 8.10  Používateľ
      serus, som tu zasa s inym problemom, uz to bude asi jednoduchsie...
      ComboBox6.Clear;
      Query8.SQL.Clear;
      Query8.SQL.Add('SELECT a.Meno_autora,b.Nazov FROM autor a,album b INNER JOIN CD ON((b.ID_Album=CD.ID_Album)and(a.ID_Autor=CD.ID_Autor))');
      Query8.Open;
      while not Query8.eof do
      begin
      ComboBox6.items.add(Query8.FieldValues[('Meno_autora','Nazov')] );
      Query8.next;
      end;
      //ComboBox4.ItemIndex := 0;
      Query7.First;
      end;

      'Meno_autora','Nazov' som tam nechal naschval, chcel by som, aby som mal v comboboxe v jednom riadku vypisane obidva tieto polia. no v tejto forme to nefunguje, neviete mi niekto poradit ako to mam zapisat?
      dakujem
      • Re: SQL+INSERT+premenna typu integer 04.05.2008 | 20:40
        Avatar djway UBUNTU 8.10  Používateľ
        ComboBox6.Clear;
        Query8.SQL.Clear;
        Query8.SQL.Add('SELECT a.Meno_autora,b.Nazov FROM autor a,album b INNER JOIN CD ON((b.ID_Album=CD.ID_Album)and(a.ID_Autor=CD.ID_Autor))');
        Query8.Open;
        while not Query8.eof do
        begin
        ComboBox6.items.add(Query8.FieldValues['Meno_autora','Nazov'] );
        Query8.next;
        end;
        Query8.First;
        end;

        v tom vyssie boli chybicky krasy... tu som dal spravny kod, ale to ['Meno_autora','Nazov'] samozrejme nefunguje...
      • Re: SQL+INSERT+premenna typu integer 04.05.2008 | 21:01
        Avatar Zefram Cochrane MS Windows Vista Ultimate 64bi  Používateľ
        Query8.FieldValues je tusim 1 rozmerne pole stlpcov, nemozes spravit:
        Query8.FieldValues[('Meno_autora','Nazov')]

        Nedava to zmysel. Navyse FieldValues velmi nepouzivaj, pouzi radsej FieldByName. Musis to spravit takto:
        ComboBox6.items.add(
          Query8.FieldByName('Meno_autora').AsString+' '+
          Query8.FieldByName('Nazov').AsString);
        
        • Re: SQL+INSERT+premenna typu integer 04.05.2008 | 21:11
          Avatar djway UBUNTU 8.10  Používateľ
          Opat ti velmi pekne dakujem, uz ti idem karton piva. ;-)