←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

błąd sql

  • +
  • -
csMaster - zdjęcie csMaster 03.08.2020

[Save] Blad w zapytaniu: Commands out of sync; you can't run this command now

Wie ktoś co może oznaczać ten błąd ?

Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 03.08.2020

Hm, generalnie nie można wysłać dwóch zapytań jednocześnie, to oznacza ten błąd.

Prawdopodobnie masz gdzieś SQL_PrepareQuery, które nie zostało wysłane przez SQL_ExecuteQuery (tak się domyślam, bazując na Twoim wczorajszym poście).

Odpowiedz

  • +
  • -
csMaster - zdjęcie csMaster 04.08.2020

                new qCommand[36000], Handle:hQuery, iError, szError[512], Handle:hConnection = SQL_Connect(hTuple, iError, szError, charsmax(szError));
		if(!hConnection)
		{
			log_amx("[Save] Nie mozna polaczyc sie z baza danych.");
			log_amx("[Save] Blad: %s", szError);
			SQL_FreeHandle(hConnection);
			return;
		}
		
		//...
		hQuery = SQL_PrepareQuery(hConnection, qCommand);
		
		if(!SQL_Execute(hQuery))
		{
			SQL_QueryError(hQuery, szError, charsmax(szError));
			log_amx("[Save] Blad w zapytaniu: %s", szError);
			SQL_FreeHandle(hConnection);
			return;
		}
		
		//...
		hQuery = SQL_PrepareQuery(hConnection, qCommand);
		if(!SQL_Execute(hQuery))
		{
			SQL_QueryError(hQuery, szError, charsmax(szError));
			log_amx("[Save] Blad w zapytaniu: %s", szError);
			SQL_FreeHandle(hConnection);
			return;
		}
                //...
		hQuery = SQL_PrepareQuery(hConnection, qCommand);
		if(!SQL_Execute(hQuery))
		{
			SQL_QueryError(hQuery, szError, charsmax(szError));
			log_amx("[Save] Blad w zapytaniu: %s", szError);
			SQL_FreeHandle(hConnection);
			return;
		}
		

Kopiuj + wklej z usunięciem formatex. Kod zatrzymuje się na ostatnim tutaj warunku który jednocześnie wykonuje zapytanie sql (warunek wykonuje się i na końcu zwraca return). Sporo czasu spędziłem nad tym fragmentem kodu ale nic nie widzę. Wszędzie gdzie jest SQL_PrepareQuery jest również po nim SQL_Execute. Co prawda w warunku ale to raczej nie ma znaczenia. Również nigdzie nie zapomniałem o SQL_FreeHandle. Wydaje mi się że wszystko jest dobrze, no jednak trzecie zapytanie (i nie ostatnie) kończy się błędem.

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 04.08.2020

To co zwraca SQL_PrepareQuery też trzeba zwalniać tak jak to napisane w dokumentacji:

/**
 * Prepares a query.
 * 
 * @note This does not actually do a query!
 * 
 * @param db            Connection handle, returned from SQL_Connect().
 * @param fmt           Query string. Can be formated with format specifiers.
 * @param ...           Additional format specifiers used to format the query.
 * 
 * @return              Returns an SQL query handle, which must always be freed.
 *                      Returns Empty_Handle on failure.
 */
native Handle:SQL_PrepareQuery(Handle:db, const fmt[], any:...);

W kodzie tego nie widać. Trzeba zwolnić to zarówno w bloku, który obsługuje błąd jak i poza nim.

 

 

Warto dodać, że zamiast robić tak długich bloków kodu, które robią praktycznie to samo, możesz użyć funkcji, której tylko podasz query. Jeśli się nie myle to w sqlx.inc jest coś takiego.

 

Spoiler

 

Also, jestem ciekaw jak długie zapytania masz, że aż taki bufor potrzebujesz :D

new qCommand[36000]
Odpowiedz

  • +
  • -
csMaster - zdjęcie csMaster 04.08.2020

 

To co zwraca SQL_PrepareQuery też trzeba zwalniać tak jak to napisane w dokumentacji:

/**
 * Prepares a query.
 * 
 * @note This does not actually do a query!
 * 
 * @param db            Connection handle, returned from SQL_Connect().
 * @param fmt           Query string. Can be formated with format specifiers.
 * @param ...           Additional format specifiers used to format the query.
 * 
 * @return              Returns an SQL query handle, which must always be freed.
 *                      Returns Empty_Handle on failure.
 */
native Handle:SQL_PrepareQuery(Handle:db, const fmt[], any:...);

W kodzie tego nie widać. Trzeba zwolnić to zarówno w bloku, który obsługuje błąd jak i poza nim.

 

Już rozwiązałem ten problem, zmieniłem zapytanie na którym zatrzymywał się plugin, teoretycznie było to kilka zapytań w jednym SQL_PrepareQuery. Nie wiedziałem że to również powoduje taki błąd. Tak szczerze mówiąc bez żadnego SQL_FreeHandle wszystko działa, ale oczywiście zwolnię tym wszystkie uchwyty.

 

 

Also, jestem ciekaw jak długie zapytania masz, że aż taki bufor potrzebujesz :D

new qCommand[36000]

 

Tak długi potrzebny mi był przy odczytywaniu danych z bazy, chociaż chyba rzeczywiście trochę przesadziłem. Przy zapisie czego tyczył się ten temat najdłuższe zapytanie miało jakieś 3300 znaków, ale widocznie odruchowo napisałem 36000. I chyba powinienem to zmniejszyć bo to raczej nie wpływa dobrze na wydajność jeśli zmienna jest 10 razy większa niż powinna.

Odpowiedz