2011-08-01 16 views
8

Mi código:MySQL Query ejecuta pero lanza una excepción

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; 
} 

Crea el user22 sino que también se emite una (vacío?) Excepción:

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

Por supuesto, volver a ejecutar el resultado es una excepción adecuada :

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

Al comentar los resultados de la línea executeQuery en sin excepciones (salida de blanco) ¿Es esto común? ¿Debería simplemente ignorar esto?

+0

¿Está utilizando el controlador más reciente? ¿Has buscado en los foros de MySQL? –

+0

Esto parece un duplicado de http://stackoverflow.com/q/5555328/310112 al menos pruebe la solución publicada allí y vea si le funciona. –

+0

@Joel: No estoy teniendo ese problema. Probé Flush Privilages de todos modos, no funciona. – lalli

Respuesta

18

está usando el executeQuery, lo que supone que retorno objeto SQL :: conjunto de resultados, y se le quering "CREATE USER" que devuelve verdadero o falso.

Hay un ejecutar el método para tales casos. Entonces ...

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

no lanzará un error.

Sí, sé que la publicación tiene 2 años, pero si alguien se topa con el mismo problema en el futuro podría ser útil para ellos.

+0

+1 para la respuesta a una pregunta muy antigua. Perdí el código, así que no puedo probarlo de inmediato. Voy a probar y aceptar la respuesta con el tiempo, o si alguien más lo verifica antes que yo ... – lalli

+0

1 año después. No funcionó para mí –

+0

4 años después y * funcionó * para mí. – phobos51594

0

De Referencia de MySQL - 13.6.7.2 DECLARE ... HANDLER Syntax:

Un valor SQLSTATE (una cadena de 5 caracteres literal) o un código de error de MySQL (un número). No debe usar el valor SQLSTATE '00000' o el código de error 0 de MySQL, ya que estos indican el éxito en lugar de una condición de error. Para obtener una lista de los valores de SQLSTATE y los códigos de error de MySQL, consulte la Sección C.3, "Códigos y mensajes de error del servidor".

+0

¿Por qué votar abajo? Según MySQL, puede ignorar el código de error 0 de la excepción ya que 0 se considera una ejecución válida. – Jesse

+0

¿La ejecución válida no impediría que se lanzara la excepción en primer lugar? –

0

Recientemente tuve la situación de que una consulta dio como resultado una excepción con el código de error 0 y el estado sql 1000. Probablemente no sea el problema, pero en caso de que alguien tropiece con este hilo mientras intenta descubrir algo similar aquí Lo resolví por mí:

La razón por la que recibí este error fue que los archivos de registro escritos por el conector Java (el registro lento de consultas del cliente y el registro de métricas de rendimiento) fueron creados por el usuario incorrecto para que mi proceso no permitió sobrescribirlos. Para ser justos, esto generó una advertencia durante el inicio, pero no esperaba una excepción cada vez que el conector intentaba escribir en el registro.

Este sería un ejemplo en el que una excepción con el código de error 0 puede verse como una advertencia que podría ignorarse (como la respuesta de Jesse citada de la referencia de MySQL).

Por cierto: el código de estado 0 significa la finalización exitosa (al igual que el código de error MySql 0) y el código de estado 1000 significa "advertencia" (https://docs.oracle.com/cd/F49540_01/DOC/server.815/a58231/appd.htm).

+2

Saludos. Es lamentable que esta respuesta se haya marcado como de baja calidad. La información que ha dado probablemente se puede usar para responder las preguntas, pero debe incluir esas oraciones adicionales. Después de haber respondido estas preguntas, dudo que esta pregunta se elimine. "¿Es esto común? ¿Debo ignorar esto?" – Sebivor

Cuestiones relacionadas