【问题标题】:Insert String in HSQLDB在 HSQLDB 中插入字符串
【发布时间】:2017-09-26 18:45:18
【问题描述】:

我尝试在 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 +")";

同样的错误发生

【问题讨论】:

  • 所以,您不会认为emergency 字段的内容可能与手头的问题有任何相关性,是吗?
  • 而且你不认为当错误发生时向我们展示sql字符串的实际内容有任何意义,对吧?

标签: java hsqldb


【解决方案1】:

使用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。不要那样做。使用数据库中的序列或标识列。从一开始就正确地做。对于单用户应用程序,这可能没有什么不同,但是您无法在多个用户同时使用的应用程序中实现正确可扩展性,并发事务插入同一张桌子。

【讨论】:

  • 现在程序已经 eroors 在emergency_id:java.sql.SQLSyntaxErrorException:用户缺少权限或找不到对象:语句中的EMERGENCY_ID [INSERT INTO Emergency (emergency_id, status, type_d, type_b, floor_id) 值( ?, ?, ?, ?, ?)] 在 org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) at org.hsqldb.jdbc.JDBCPreparedStatement.(未知来源)
  • @F.Aker:我不得不猜测列名,因为您没有向我们展示表定义。当然,您需要用正确的表名称替换它们。请不要只是盲目地复制从互联网上获得的代码。阅读它,试着理解它并根据你的情况做必要的调整。
  • 我的错。但现在它说参数标记不允许
  • @F.Aker:我的答案中的代码将不会生成该错误
【解决方案2】:

我在@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"

【讨论】:

    【解决方案3】:

    我知道这个问题很老,但我遇到了同样的问题,并在不使用 PreparedStatements 的情况下找到了我的解决方案。

    INSERT INTO TypeA (id) VALUES ("Hello");
    

    失败(用户缺少权限或找不到对象:您好),但是

    INSERT INTO TYPEA (id) VALUES ('Hello');
    

    工作。所以似乎不接受双引号(另见http://www.hsqldb.org/doc/1.8/guide/ch09.html#expression-section

    【讨论】:

      猜你喜欢
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 2011-10-19
      • 2021-05-01
      相关资源
      最近更新 更多