2011-08-01 22 views
8

Mój kod:MySQL Query wykonuje ale rzuca wyjątek

try { 
    sql::Driver *driver; 
    sql::Connection *con; 
    sql::Statement *stmt; 

    /* Create a connection */ 
    driver = get_driver_instance(); 
    con = driver->connect("tcp://127.0.0.1:3306", "root", "123456"); 

    stmt = con->createStatement(); 
    stmt->executeQuery("CREATE USER 'user22'"); 

    delete stmt; 
    delete con; 

} catch (sql::SQLException &e) { 
    cout << "# ERR: " << e.what(); 
    cout << " (MySQL error code: " << e.getErrorCode(); 
    cout << ", SQLState: " << e.getSQLState() << ")" << endl; 
} 

Tworzy user22 ale także generuje (pusty?) Wyjątek:

# ERR: (MySQL error code: 0, SQLState: 00000) 

oczywiście ponowne wykonanie skutkuje prawidłowym wyjątkiem :

# ERR: Operation CREATE USER failed for 'user22'@'%' (MySQL error code: 1396, SQLState: HY000) 

Komentując wyniki w linii executeQuery bez wyjątków (wyjście puste) Czy to powszechne? Czy powinienem to zignorować?

+0

Czy używasz najnowszego sterownika? Przeszukałeś fora MySQL? –

+0

To wygląda na duplikat http://stackoverflow.com/q/5555328/310112 przynajmniej spróbuj opublikowanego tam rozwiązania i sprawdź, czy to działa. –

+0

@Joel: Nie mam tego problemu. Mimo to spróbowałem Flush Privilages, to nie działa. – lalli

Odpowiedz

18

Używasz executeQuery, który podobno powrót sql :: ResultSet obiektu, a ty quering "CREATE USER" która zwraca prawdę lub fałsz.

Dla takich przypadków jest wykonywana metoda dla wykonania. Więc ...

stmt = con->createStatement(); 
stmt->execute("CREATE USER 'user22'"); 

nie spowoduje błędu.

Tak, wiem, że poczta ma 2 lata, ale jeśli ktoś wpadnie na ten sam problem w przyszłości, może być dla nich przydatny.

+0

+1 za odpowiedź na naprawdę stare pytanie. Zgubiłem kod, więc nie mogę go przetestować od razu. Testuję i akceptuję odpowiedź w końcu, lub jeśli ktoś inny zweryfikuje to przede mną .. – lalli

+0

1 rok później. Nie działa dla mnie. –

+0

4 lata później i * działało * dla mnie. – phobos51594

0

z MySQL Reference - 13.6.7.2 DECLARE ... HANDLER Syntax:

wartość SQLSTATE (ciąg 5-znakowy dosłowny) lub kod błędu MySQL (liczba). Nie powinieneś używać wartości SQLSTATE "00000" lub kodu błędu MySQL 0, ponieważ wskazują one na sukces, a nie na błąd. Aby uzyskać listę wartości SQLSTATE i kodów błędów MySQL, zobacz Rozdział C.3, "Kody błędów i komunikaty o błędach serwera".

+0

Dlaczego głosowanie w dół? Według MySQL można zignorować kod błędu 0 z wyjątku, ponieważ 0 jest uważane za poprawne wykonanie. – Jesse

+0

Czy poprawne wykonanie wyklucza wyjątek zgłaszany w pierwszej kolejności? –

0

Niedawno zdarzyło mi się, że zapytanie wygenerowało wyjątek z kodem błędu 0 i stanem sql 1000. Prawdopodobnie nie było to problemem, ale na wypadek, gdyby ktoś natknął się na ten wątek, próbując znaleźć coś podobnego tutaj co rozwiązało to dla mnie:

Powodem, dla którego ciągle pojawiał się ten błąd, było to, że pliki dziennika napisane przez złącze Java (dziennik powolnego dziennika po stronie klienta i dziennik danych wydajności) zostały utworzone przez niewłaściwego użytkownika, aby mój proces nie mógł ich zastąpić. Szczerze mówiąc, podczas uruchamiania komputera pojawiło się ostrzeżenie, ale nie spodziewałem się wyjątku za każdym razem, gdy złącze próbowało zapisać w dzienniku.

To byłby przykład, w którym wyjątek z kodem błędu 0 może być w rzeczywistości postrzegany jako ostrzeżenie, które można zignorować (jak na przykład odpowiedź Jesse'a cytowana w bazie MySQL).

Nawiasem mówiąc: kod stanu 0 oznacza pomyślne zakończenie (podobnie jak kod błędu MySql 0), a kod stanu 1000 oznacza "ostrzeżenie" (https://docs.oracle.com/cd/F49540_01/DOC/server.815/a58231/appd.htm).

+2

Pozdrowienia. To niefortunne, że ta odpowiedź została oznaczona jako niska jakość. Informacje, które podałeś, mogą prawdopodobnie posłużyć do odpowiedzi na zadane pytania, ale musisz umieścić te dodatkowe kilka zdań. Po udzieleniu odpowiedzi na te pytania wątpię, aby to pytanie zostało usunięte. "Czy to powszechne? Czy powinienem to zignorować?" – Sebivor

Powiązane problemy