Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[VisualC++ CLI \ MySQL] Syntax error w zapytaniu, które zawiera USER VARIABLE.

Ostatnio zmodyfikowano 2016-03-24 07:55
Autor Wiadomość
SmthIsNoYes
Temat założony przez niniejszego użytkownika
[VisualC++ CLI \ MySQL] Syntax error w zapytaniu, które zawiera USER VARIABLE.
» 2016-03-24 07:55:05
Witam,

Mam tutaj dosyć irytujący problem z zapytaniem, które działa jak marzenie z poziomu MySQL Workbench, ale wywala błąd w trakcie działania programu.
Workbench:
select * from (select zid, szw1+szw2 as pkt, @rank:=@rank+1 as rank from zlecenie_pkt, (select @rank:=0) r order by pkt desc) a where zid=263;

C++ CLI:
zapytanie = "select * from (select zid, szw1+szw2 as pkt, @rank:=@rank+1 as top from zlecenie_pkt, (select @rank:=0) r order by pkt desc) a where zid=" + m_zid + ";";

To samo tyczy się prodcedur MySQL. Działają bez problemu z poziomu Workbench, ale "call ranking();' już wywala syntax error w skompilowanym programie.

Przeszukałem całe internety, znalazłem kilka popularnych rozwiązań ale żadne z nich się nie sprawdziło w moim przypadku.

Dodam tylko, że połączenie do bazy nawiązuje z parametrem "Allow User Variables=True" więc teoretycznie, problem nie powinien w ogóle występować.


/////////////////////////////////////////////// EDIT ////////////////////////////////////////////

Udało mi się znaleźć rozwiązanie problemu - chodziło o zasięg zmiennej @rank, którą definiowałem wewnątrz mojego zapytania.
Rozwiązaniem jest wywołanie cmd->ExecuteNonQuery() przed wywołaniem cmd->ExecuteReader().

Swoją drogą, jestem trochę zaskoczony tym rozwiązaniem bo byłem przekonany że ExecuteNonQuery stosuje się do poleceń jak INSERT albo UPDATE, które nie zwracają wyniku i nie przyszłoby mi do głowy żebym w ten sposób rozwiązać problem z zasięgiem.


Tutaj oryginalne rozwiązanie problemu:
If you want to be able to use variables, use one MySqlCommand object, and call ExecNonQuery() once.

Your best bet is to create a stored procedure. Perhaps it'll need 2 parameters for your "guid"/integer values.

The reason it works in SQLYog is that all those statements are running in the same context, rather than in different sessions.

P-146481
« 1 »
  Strona 1 z 1