我尝试将一个String插入一个hsqldb,它给了我这个错误:
> 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)
列设置为VARCHAR(50)
,sqlstring的构建方式如下:
String sql = "INSERT INTO Emergency Values(" + Counter.emergencyID + ","+
emergency.status +"," + "\""+ emergency.typeD +"\"" + "," + "\""+
emergency.typeB +"\"" + ","+ emergency.floorID + ")";
这是我执行查询的方式:
Statement st = null;
st = con.createStatement(); // statements
int i = st.executeUpdate(sql); // run the query
PS:我知道我对这样的sqlInjection持开放态度。
编辑:值
sql = "INSERT INTO Emergency Values(0,1,"S","IB",1)"
如果我将字符串更改为;
String sql = "INSERT INTO Emergency Values(" + Counter.emergencyID + ","+
emergency.status +","+ emergency.typeD +","+ emergency.typeB +","+
emergency.floorID +")";
发生同样的错误
答案 0 :(得分:2)
使用PreparedStatement
,您将不会遇到任何问题:
String sql =
"INSERT INTO Emergency (emergency_id, status, type_d, type_b, floor_id) " +
" Values (?, ?, ?, ?, ?)";
请注意,我在insert
语句中明确列出了列名。不这样做被认为是不好的编码风格。
我不得不猜测这些名称,因为您没有向我们展示您的表格的定义。您有替换为表的正确列名。
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
问题的根本原因是双引号的使用不正确:"
。字符串常量必须放在SQL中的单引号中。 'foobar'
是一个字符串值。双引号用于标识符"foobar"
,例如列名。
无关,但是:使用Counter.emergencyID
让我认为您正在应用程序中生成(或尝试)唯一ID。不要那样做。使用数据库中的序列或标识列。从一开始就正确地做到了。对于单个用户应用程序而言,这可能没有什么区别,但是您无法在多个用户同时使用的应用程序中正确实现和可扩展性,同时插入并发事务同桌。
答案 1 :(得分:1)
我在@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 query
请注意最后一行,应该是
int i = pstmt.executeUpdate(); // run the query
请参考HSQLDB cryptic exception message: "feature not supported"
答案 2 :(得分:0)
我知道这个问题很旧,但是我遇到了同样的问题,没有使用PreparedStatements就找到了解决方案。
INSERT INTO TypeA (id) VALUES ("Hello");
失败(用户缺少特权或未找到对象:Hello ),但是
INSERT INTO TYPEA (id) VALUES ('Hello');
工作。因此,似乎双引号不被接受(另请参见http://www.hsqldb.org/doc/1.8/guide/ch09.html#expression-section)