Portál AbcLinuxu, 10. května 2025 05:31

Dotaz: QSqlQuery prepare

xxxxxx avatar 2.6.2016 12:07 xxxxxx | skóre: 23
QSqlQuery prepare
Přečteno: 428×
Odpovědět | Admin
Zdravím,

mám v Qt připojenou MySQL a nějak mi nejde do hlavy, jak to přesně funguje. Samozřejmě jsem prolezl Qt dokumentaci i SO, ale nic mi neodpovědělo.
QSqlQuery query;

QString prod_id = "blabla";

query.exec("SELECT pictures FROM products WHERE id='" + prod_id + "';");

// Funguje, query.next() je OK, hodnotu "pictures" dostanu
QSqlQuery query;

QString prod_id = "blabla";

query.prepare("SELECT pictures FROM products WHERE id=:prod_id;");
query.bindValue(":prod_id", prod_id);
query.exec();

// exec funguje, ale query.next() nic
QSqlQuery query;

QString prod_id = "blabla";

auto db = QSqlDatabase::database();

db.transaction();

query.prepare("SELECT pictures FROM products WHERE id=:prod_id;");
query.bindValue(":prod_id", prod_id);
query.exec();

db.commit();

// Všechno funguje, hodnotu pictures dostanu
Tedy rád bych věděl, proč 2. příklad nefunguje a proč je zapotřebí transakce? Ke stejné DB se připojuji ještě z PHP, kde prepare funguje bez transakce.

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

2.6.2016 16:19 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: QSqlQuery prepare
Odpovědět | | Sbalit | Link | Blokovat | Admin
Qt neznám, ale myslím si, že úplně stejně jako v PHP metoda prepare() vytvoří novou instanci, na kterou je následně bindují parametry. Tedy nikoli na objekt query, ale na objekt vytvořený v jeho továrně.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
xxxxxx avatar 2.6.2016 17:16 xxxxxx | skóre: 23
Rozbalit Rozbalit vše Re: QSqlQuery prepare
Bohužel, tady prepare vrací bool a podle dokumentace by to mělo fungovat, jako v tom 2. příkladu, jenže nefunguje.
2.6.2016 17:52 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: QSqlQuery prepare
V původním dotazu vidím, že prod_id je typu string. Neměl by to být integer?
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
xxxxxx avatar 2.6.2016 17:57 xxxxxx | skóre: 23
Rozbalit Rozbalit vše Re: QSqlQuery prepare
Nn, to tak má být, id tady může obsahovat jakékoliv znaky, takže je to varchar.
Řešení 1× (xxxxxx (tazatel))
skunkOS avatar 3.6.2016 08:35 skunkOS | skóre: 27 | blog: Tak nějak
Rozbalit Rozbalit vše Re: QSqlQuery prepare
Odpovědět | | Sbalit | Link | Blokovat | Admin
Radím vytvářet QSqlQuery objekt přes tento konstruktor.

http://martinrotter.github.io
xxxxxx avatar 3.6.2016 11:17 xxxxxx | skóre: 23
Rozbalit Rozbalit vše Re: QSqlQuery prepare
Díky, tohle funguje :) Ale proč to funguje? Čekal bych, že si QSqlQuery automaticky vezme tu jedinou DB, ke které jsem připojen.
3.6.2016 14:18 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: QSqlQuery prepare
Proč by měl? Singletony už nefrčí.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
xxxxxx avatar 3.6.2016 14:32 xxxxxx | skóre: 23
Rozbalit Rozbalit vše Re: QSqlQuery prepare
Proto:

QSqlQuery::QSqlQuery(QSqlDatabase db)

Constructs a QSqlQuery object using the database db. If db is invalid, the application's default database will be used.

Ale to mi pořád neodpovídá na to, proč to s transakcí nebo bez prepare() funguje i bez odkazu na existující DB.
3.6.2016 15:15 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: QSqlQuery prepare
Bude to nejspíš bug, který by se měl ohlásit vývojářům. Dosud na něj nejspíš nikdo nenarazil proto, že začátečníci obvykle nepoužívají prepared statements a pokročilí zase nepoužívají defaultní databázi.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
xxxxxx avatar 3.6.2016 15:52 xxxxxx | skóre: 23
Rozbalit Rozbalit vše Re: QSqlQuery prepare
A jaký je důvod ji nepoužívat? Od startu aplikace až do konce se bude používat jen jedna. Tím, že ji odliším pojmenováním si akorát do kódu přidám nutnost na tu DB odkazovat tím jménem. Když to udělám, nebude to pak svádět k tomu myslet si, že někde existuje ještě další? Nebo kvůli pozdějšímu případnému přidání další? Nebo jak to udělat lépe?
3.6.2016 16:08 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: QSqlQuery prepare
Například kvůli TDD. Obvykle se na testy používá jiná databáze, resp. mock. Je důležité vykopat vnější závislosti ven z objektů.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
xxxxxx avatar 3.6.2016 16:42 xxxxxx | skóre: 23
Rozbalit Rozbalit vše Re: QSqlQuery prepare
OK, díky :)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.