Autor Téma: Nefunguje INSERT do mdb, chyba Parameter not found  (Přečteno 2603 krát)

Offline KarlosCZ

  • Nováček
  • *
  • Příspěvků: 31
  • Karma: 0
    • Verze Delphi: xe7
Dobrý den, nemůžu vyřešit přidání řádku do .mdb. Sloupec Plr_Fname v té tabulce je, příkaz select s ním normálně funguje. Přesto dostávám hlášku AdoQuery1: Parameter 'Plr_Fname' not found. Totéž to hlásilo předtím u [year of birth] / nastavil jsem paramcheck na false a ten [year of birth] už nehlásí, zato jak jsem psal začal hlásit chybu u Plr_Fname. Netuší někdo prosím čím to je? Díky předem.

datamodule1.adoQuery1.SQL.Clear;
datamodule1.adoQuery1.SQL.Add('INSERT INTO judokas (Plr_Fname, Plr_Lname, [year of birth])');
datamodule1.adoQuery1.SQL.Add('VALUES (:Plr_Fname,:Plr_Lname,:[year of birth])');   
datamodule1.adoQuery1.Parameters.ParamByName('Plr_Fname').Value:= splitted[1];
datamodule1.adoQuery1.Parameters.ParamByName('Plr_Lname').Value:= splitted[0];
datamodule1.adoQuery1.Parameters.ParamByName('[year of birth]').Value:= strtoint(splitted[2]);
datamodule1.adoQuery1.ExecSQL;
datamodule1.adoQuery1.Close;

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2966
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #1 kdy: 02-08-2016, 08:35:42 »
Citace
datamodule1.adoQuery1.SQL.Add('INSERT INTO judokas (Plr_Fname, Plr_Lname, [year of birth])');
datamodule1.adoQuery1.SQL.Add('VALUES (:Plr_Fname,:Plr_Lname,:[year of birth])');
Prvý riadok predpokladám v tvare:
Kód: [Vybrat]
datamodule1.adoQuery1.SQL.Add('INSERT INTO judokas (Plr_Fname, Plr_Lname, "year of birth")');
Druhý si uprav na
Kód: [Vybrat]
datamodule1.adoQuery1.SQL.Add('VALUES (:Plr_Fname, :Plr_Lname, :YearOfBirth)');
Ak je to možné, vyhoď zo všetkých názvov v mdb medzery! To je ako by si použil diakritiku. A nebudeš mať takéto problémy.
« Poslední změna: 02-08-2016, 08:37:45 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline KarlosCZ

  • Nováček
  • *
  • Příspěvků: 31
  • Karma: 0
    • Verze Delphi: xe7
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #2 kdy: 02-08-2016, 12:42:11 »
Díky, problém není v tom Year of birth, tam to řeší [], klasické uvozovky nefungují. Myslím, že problém je v celé té konstrukci, protože chybu to háže u Plr_Fname. Tam není mezera ani diakritika, při select to normálně funguje, při pokusu přidat řádek do dtabáze to ale píše AdoQuery1: Parameter 'Plr_Fname' not found. S těma mezerama jsem se dost natrápil, bohužel to nejde změnit. Nevím jak:-) a i kdybych věděl, ta databáze se aktualizuje a stahuje pokaždé znovu. Toho dobráka, co ji navrhoval, bych někdy rád potkal. Každopádně ten problém je v Plr_Fname, kde by ale vůbec žádný problém být neměl.

Offline leste

  • Nováček
  • *
  • Příspěvků: 5
  • Karma: 0
    • Verze Delphi: D7, XE7
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #3 kdy: 02-08-2016, 12:55:52 »
Když vkládáš dotaz za běhu s vypnutým paramcheckem tak ty parametry asi nezná.

Offline KarlosCZ

  • Nováček
  • *
  • Příspěvků: 31
  • Karma: 0
    • Verze Delphi: xe7
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #4 kdy: 02-08-2016, 14:09:32 »
 :o aha, no jasně. Tím se to ale vrací k chybě u Year of birth. Nejlepší by bylo ten sloupec přejmenovat na Year_of_Birth v celém mdb. Zkoušel jsem to googlit ale nenašel jsem řešení. Jde to nějak udělat za běhu? Zrušil bych tak všechny mezery i v ostatních sloupcích a měl bych klid. Ale nechápu, proč když SELECT bez problému funguje, když je to ve tvaru [Year of Birth] a insert tak nefunguje. Nefunguje ani s apostrofy a uvozovkami a ani yearofbirth bez mezer, což je asi logické.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 702
  • Karma: 40
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #5 kdy: 02-08-2016, 14:16:30 »
Vždyť ti to už napsal Standa. Parametr nemusí být shodný s názvem sloupce. Změň jméno parametru:

Kód: [Vybrat]
datamodule1.adoQuery1.SQL.Add('VALUES (:Plr_Fname, :Plr_Lname, :YearOfBirth)');
datamodule1.adoQuery1.Parameters.ParamByName('YearOfBirth').Value:= strtoint(splitted[2]);

Pochybuju, že Delphi umí paramtery s [], i když jsem si to neověřoval.
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Online pf1957

  • Padawan
  • ******
  • Příspěvků: 1837
  • Karma: 86
    • Verze Delphi: D2007, XE3, DX10
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #6 kdy: 02-08-2016, 15:05:14 »
Zkoušel jsem to googlit ale nenašel jsem řešení. Jde to nějak udělat za běhu? Zrušil bych tak všechny mezery i v ostatních sloupcích a měl bych klid.
Abys mohl neco googlit, tak to znamena, ze si nekde prectes aspon zaklady prace s databazi...

Samozrejme to jde. Nektere RDBMS umi primo prejmenovat sloupec, nekde se to musi obejit posloupnosti:
Kód: SQL [Vybrat]
  1. ALTER TABLE XXX ADD COLUMN YYY .....;
  2. UPDATE TABLE XXX SET YYY = "Y Y Y";
  3. ALTER TABLE XXX DROP COLUMN "Y Y Y";
  4.  
a pokud puvodni sloupec participoval na nejakem indexu nebo constraintu, musi se analogicky dropnout a vytvorit znovu s novym sloupcem.

Podrobnosti viz SQL DDL a referece guide konkretrniho RDBMS.


Online pf1957

  • Padawan
  • ******
  • Příspěvků: 1837
  • Karma: 86
    • Verze Delphi: D2007, XE3, DX10
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #7 kdy: 02-08-2016, 15:08:10 »
Zrušil bych tak všechny mezery i v ostatních sloupcích a měl bych klid.
A kdybys to nahodou delal, tak zrus i ta priblba podtrzitka - to je na platforme Delphi cizorody prvek, tady se pouziva Camel case.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2966
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #8 kdy: 02-08-2016, 15:31:28 »
Podľa koncovky predpokladám, že sa jedná o Access. Ale ja neviem aké rozšírenie používa MS SQL :) , keď už si to hodil do tejto sekcie.
Jedná sa o ten Access?
Access má trochu zradu v tom, že je rozdiel kde sa ten SQL text tvorí. Má rozdielny syntax!!! A ak k tomu pridáme syntax v Delphi, tak to je občas celkom sranda ;)
Pre Access mám múdru knihu. Takže sa môžem pozrieť.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline KarlosCZ

  • Nováček
  • *
  • Příspěvků: 31
  • Karma: 0
    • Verze Delphi: xe7
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #9 kdy: 02-08-2016, 16:28:47 »
tak jsem to přejmenoval a je po starostech - částečně. Každopádně díky. Teď musím ještě vyřešit, proč se sice insert provede, ale databáze zůstane nezměněná a ta data se tam nezapíšou.

Offline KarlosCZ

  • Nováček
  • *
  • Příspěvků: 31
  • Karma: 0
    • Verze Delphi: xe7
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #10 kdy: 02-08-2016, 16:39:48 »
Podľa koncovky predpokladám, že sa jedná o Access.
ano je to acces

Offline KarlosCZ

  • Nováček
  • *
  • Příspěvků: 31
  • Karma: 0
    • Verze Delphi: xe7
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #11 kdy: 02-08-2016, 17:11:14 »
Ještě "drobnost". Aby to přejmenování fungovalo, musí být uvedený typ sloupce a v druhém příkazu nesmí být TABLE.... >:(

datamodule1.ADOQuery1.sql.add ('ALTER TABLE judokas ADD COLUMN [YearOfBirth] INTEGER');
datamodule1.ADOQuery1.sql.add ('UPDATE [judokas] SET [YearOfBirth] = [Year Of Birth]');

Proč to odmítá fungovat s jakýmkoliv jiným typem než INTEGER nevím:-) a ani mě to netrápí:-)

Online pf1957

  • Padawan
  • ******
  • Příspěvků: 1837
  • Karma: 86
    • Verze Delphi: D2007, XE3, DX10
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #12 kdy: 02-08-2016, 17:22:16 »
Ještě "drobnost". Aby to přejmenování fungovalo, musí být uvedený typ sloupce a v druhém příkazu nesmí být TABLE.... >:(
To jsem ti taky jenom nastinil princip, jak se to dela. Ze tam ma byt typ sloupce, to jsou ty tecky za YYY (urcite tam nejaky CHAR, VARCHAR, NVARCHAR apod. pujde taky)
a ze jsem u update pripsal TABLE - no jsem starej vul a HOSIP a primo SQL prikazy uz jsem nepsal nekolik let: dnes jen upravim definici tridy (v C#) a vetsinou jen pasivne zkouknu, co mi framework vygeneroval za evolucni skript.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2966
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #13 kdy: 02-08-2016, 17:26:49 »
Na insert, update či zmenu DB máš správne použiť TADOCommand.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online pf1957

  • Padawan
  • ******
  • Příspěvků: 1837
  • Karma: 86
    • Verze Delphi: D2007, XE3, DX10
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #14 kdy: 02-08-2016, 17:43:20 »
Na insert, update či zmenu DB máš správne použiť TADOCommand.
Clovece ja nevim, jestli je to spravne doporuceni. Predstav si, ze za nejaky ten insert/update pridas RETURNING .... ev. ho zmenis na SP a ta SP bude vracet nejaky result set...
Kdyz pouzijes Query, tak zmenis jen SQL (a Open misto Execute), ale pokud pouzijes ten command (teda je mozne, ze se pletu a ze lze na nem taky vyloudit result set), tak jeste budes muset nahrazovat command za query.

Osobne bych to pouzil snad jenom tam, kde honim vykon a delam nejake bulk inserty. Jinak bych vsude pracoval jenom s Query a to jeste za predpokladu, ze to bude nejaky light-weight widget oproti Query.
« Poslední změna: 02-08-2016, 17:50:56 od pf1957 »

Offline KarlosCZ

  • Nováček
  • *
  • Příspěvků: 31
  • Karma: 0
    • Verze Delphi: xe7
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #15 kdy: 02-08-2016, 18:30:11 »
Poslední věc a už nebudu otravovat:-) Ten kód níž funguje ve smyslu "nevyhodí chybu", nicméně do databáze se uloží nuly ve sloupcích se jmény a rokem a nic ve sloupci membernumber. Nějak to ale pracuje, protože je tam sloupec added, kde je čas modifikace, který se tam objeví. Nevím proč se to neukládá. Poradíte?
       
        adoQuery1.SQL.Add('INSERT INTO judokas (Plr_Fname,Plr_Lname, [YearOfBirth], [MemberNumber])');
        adoQuery1.SQL.Add('VALUES (:Plr_Fname,:Plr_Lname,:yearofbirth, :membernumber)');
        adoQuery1.Parameters.ParamByName('Plr_Fname').Value:= splitted[0];
        adoQuery1.Parameters.ParamByName('Plr_Lname').Value:= splitted[1];
        adoQuery1.Parameters.ParamByName('yearofbirth').Value:= strtoint(splitted[2]);
        adoQuery1.Parameters.ParamByName('membernumber').Value:= 56886;
        datamodule1.adoQuery1.ExecSQL;
        datamodule1.adoQuery1.Close;

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2966
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #16 kdy: 02-08-2016, 18:54:57 »
Citace
Predstav si, ze za nejaky ten insert/update pridas RETURNING .... ev. ho zmenis na SP a ta SP bude vracet nejaky result set...
Ako pripomienku to beriem. Takto ma to nenapadlo. Ale v Access-e si to predstaviť neviem :D  Neviem ako RETURNING, ale SP nemá.
Citace
Nevím proč se to neukládá.
Ťažko mi je radiť, ale mne sa niečo podobné stáva, keď Query používam opakovane a pred priradením hodnôt do parametrov som nevykonal Close. Hodnoty v parametroch sa nezmenia. Ale to tam v ukážke máš. A nemáš tam cyklus/opakovanie. Neviem ako to adoQuery1 používaš a či na viacerých miestach. Ak áno, tak tam mi na začiatku chýba
Kód: [Vybrat]
adoQuery1.SQL.Close;  // Ak to zaistíš inde, tak tu to vypadne.
adoQuery1.SQL.Clear;
...
Lenže, keby si tam už mal nejaký text, tak by to zaryčalo :(  Aha, v prvej ukážke to Clear máš. Prever ten Close.
Tie hranaté zátvorky [] vyhoď. Sú tam úplne zbytočne. Či robia neplechu netuším.
« Poslední změna: 02-08-2016, 18:58:59 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline KarlosCZ

  • Nováček
  • *
  • Příspěvků: 31
  • Karma: 0
    • Verze Delphi: xe7
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #17 kdy: 02-08-2016, 21:35:21 »
Díky, Close tam mám, celé to zavírám při vstupu na PageControl preventivně. Tím to není.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2966
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #18 kdy: 02-08-2016, 21:57:16 »
Už len špekulujem. V ostatných INSERT INTO prípadoch Ti to ide?

Ja som v minulosti používal AdoCommand a nemal som problém. Teraz už používam len FireDAC. Pokiaľ si to môžeš dovoliť, tak ho použi aj Ty. Ďalšia rada je vytvárať tieto komponenty za behu. Ja len výnimočne používam niektorý komponent na viacej účelov. Veľmi sa to mieša a program je neprehľadný. Chyba je tam raz-dva.

Hop, teraz ma napadlo, že občas niektorý ADO komponent zblbne. Ale nie keď sa vytvárajú dynamicky. Takže skús adoQuery1 zmazať a znovu ho vytvoriť.

Zo seba už viac nevydolujem.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2966
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Nefunguje INSERT do mdb, chyba Parameter not found
« Odpověď #19 kdy: 03-08-2016, 12:48:38 »
Neviem či to pomôže. Podľa knihy som si vizuálne nadefinoval dopyt s parametrom IDmeno. A výsledok v SQL je takýto:
Kód: [Vybrat]
SELECT BytCislo.BytCislo, Byvajuci.Priezvisko, Byvajuci.Meno
FROM BytCislo INNER JOIN Byvajuci ON BytCislo.BytCisloID = Byvajuci.BytCisloID
WHERE (((Byvajuci.ByvajuciID)=[IDmeno]));
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):