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.
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...
ParamByName je bezpecne aj proti sql injection
Alebo mozes pouzit funkciu Format:
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:
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.
...
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?
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...
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
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...
Nedava to zmysel. Navyse FieldValues velmi nepouzivaj, pouzi radsej FieldByName. Musis to spravit takto: