Intento insertar una cadena en un hsqldb y me da este error:
> java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: S at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source) at org.hsqldb.jdbc.JDBCStatement.executeUpdate(Unknown Source) la columna se establece en VARCHAR(50) y el sqlstring se construye así:
String sql = "INSERT INTO Emergency Values(" + Counter.emergencyID + ","+ emergency.status +"," + "\""+ emergency.typeD +"\"" + "," + "\""+ emergency.typeB +"\"" + ","+ emergency.floorID + ")";así es como ejecuto la consulta:
Statement st = null; st = con.createStatement(); // statements int i = st.executeUpdate(sql); // run the queryPD: sé que estoy abierto a una inyección SQL como esta.
EDITAR: los valores son
sql = "INSERT INTO Emergency Values(0,1,"S","IB",1)"Si cambio la cadena a;
String sql = "INSERT INTO Emergency Values(" + Counter.emergencyID + ","+ emergency.status +","+ emergency.typeD +","+ emergency.typeB +","+ emergency.floorID +")";ocurre el mismo error
Use un PreparedStatement y no tendrá problemas:
String sql = "INSERT INTO Emergency (emergency_id, status, type_d, type_b, floor_id) " + " Values (?, ?, ?, ?, ?)"; Tenga en cuenta que enumeré explícitamente los nombres de las columnas en la declaración de insert . No hacer eso se considera un mal estilo de codificación.
Tuve que adivinar esos nombres porque no nos mostraste la definición de tu tabla. Debe reemplazar con los nombres de columna correctos de su tabla.
PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setInt(1, Counter.emergencyID); pstmt.setInt(2, emergency.status); pstmt.setString(3, emergency.typeD); pstmt.setInt(4, emergency.typeB); pstmt.setInt(5, emergency.floorID); int i = pstmt.executeUpdate(sql); // run the query La causa raíz de su problema fue el uso incorrecto de comillas dobles: " . Las constantes de cadena deben ponerse entre comillas simples en SQL. 'foobar' es un valor de cadena. Las comillas dobles se usan para identificadores "foobar" es, por ejemplo, un nombre de columna .
Sin relación, pero: el uso de Counter.emergencyID me permite pensar que está generando (o intentando) identificaciones únicas en su aplicación. No hagas eso. Utilice una columna de secuencia o identidad en la base de datos. Hazlo correctamente desde el principio. Para una aplicación de un solo usuario, esto podría no marcar la diferencia, pero no hay forma de que pueda implementarlo correctamente y escalable en una aplicación que utilizan varios usuarios al mismo tiempo, con transacciones simultáneas insertadas en la misma tabla.
encontré el error en el código de @a_horse_with_no_name
PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setInt(1, Counter.emergencyID); pstmt.setInt(2, emergency.status); pstmt.setString(3, emergency.typeD); pstmt.setInt(4, emergency.typeB); pstmt.setInt(5, emergency.floorID); int i = pstmt.executeUpdate(sql); // run the querytenga en cuenta la última línea, debe ser
int i = pstmt.executeUpdate(); // run the queryconsulte el mensaje de excepción críptica de HSQLDB: "característica no admitida"
Sé que la pregunta es antigua, pero me encontré con el mismo problema y encontré una solución sin usar PreparedStatements.
INSERT INTO TypeA (id) VALUES ("Hello");falló ( el usuario carece de privilegios o el objeto no se encuentra: Hola ), pero
INSERT INTO TYPEA (id) VALUES ('Hello');trabajó. Entonces parece que no se aceptan comillas dobles (ver también http://www.hsqldb.org/doc/1.8/guide/ch09.html#expression-section )