在HSQLDB中插入字符串

时间:2017-04-28 15:23:44

标签: java hsqldb

我尝试将一个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 +")";

发生同样的错误

3 个答案:

答案 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