不允许 HSQLDB 参数标记

Posted

技术标签:

【中文标题】不允许 HSQLDB 参数标记【英文标题】:HSQLDB parameter marker not allowed 【发布时间】:2017-04-28 16:59:00 【问题描述】:

使用 hsqldb 和preparedStatement 给我这个错误:

java.sql.SQLSyntaxErrorException: parameter marker not allowed
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)

我试过了:

String sql = "INSERT INTO Emergency (Id, status, typed, typeb, floor, 
locationX, locationY) Values(CAST(? AS INT), CAST(? AS INT), CAST(? AS 
VARCHAR(50)), CAST(? AS VARCHAR(50)), CAST(? AS INTEGER), CAST(? AS 
INTEGER), CAST(? AS INTEGER))";

还有:

String sql = "INSERT INTO Emergency (Id, status, typed, typeb, floor, 
locationX, locationY) Values(?,?,?,?,?,?,?)";

同样的错误。

编辑:更多代码

    try 
        con = DriverManager.getConnection(
                "jdbc:hsqldb:file:hsqldb; shutdown=true", "root", "");
        Statement stmt = con.createStatement();

        // Alle Kunden ausgeben
        //double help = ((number * pow(2.0, j)) - 1);
        String sql = "INSERT INTO Emergency (Id, status, typed, typeb, floor, locationX, locationY) Values(CAST(? AS INT), CAST(? AS INT), CAST(? AS VARCHAR(50)), CAST(? AS VARCHAR(50)), CAST(? AS INTEGER), CAST(? AS INTEGER), CAST(? AS INTEGER))";
        //Id INTEGER, status INTEGER, typeD VARCHAR(50) , typeB VARCHAR(50), floor INTEGER, locationX INTEGER, locationY INTEGER

        PreparedStatement pstmt = con.prepareStatement(sql);
        pstmt.setInt(1, Counter.emergencyID);
        pstmt.setInt(2, emergency.status);
        pstmt.setString(3, emergency.typeD);
        pstmt.setString(4, emergency.typeB);
        pstmt.setInt(5, emergency.floorID);
        pstmt.setInt(6, emergency.locationXY[0]);
        pstmt.setInt(7, emergency.locationXY[1]);
        Statement st = null;

        st = con.createStatement();    // statements

        int i = st.executeUpdate(sql);    // run the query

        Counter.emergencyID++;

        if (i == -1) 
            System.out.println("db error : " + sql);
        

        st.close();
        System.out.println("Eintrag in DB");

     catch (SQLException e) 
        e.printStackTrace();
     finally 

        if (con != null) 
            try 
                con.close();
             catch (SQLException e) 
                e.printStackTrace();
            
        
    

我正在添加所有值,然后执行它。

有人可以解释一下这里出了什么问题吗? 没有找到任何有用的搜索。

【问题讨论】:

请向我们展示更多代码 添加了更多代码 st = con.createStatement(); 是错误的。您必须使用pstmt.executeUpdate(),这是我在您上一个问题的答案中向您展示的。 【参考方案1】:

    您不需要转换类型,只需要知道 PreparedStatement 的工作原理。

    你使用的是Statement和Prepared Statement,但是你不需要Statement,你只需要执行Prepared Statement,所以改用这个:

String sql = "INSERT INTO Emergency (Id, status, typed, typeb, floor, locationX, locationY) 值(?,?,?,?,?,?,?)"; PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setInt(1, Counter.emergencyID); pstmt.setInt(2, 紧急状态); pstmt.setString(3, Emergency.typeD); pstmt.setString(4, Emergency.typeB); pstmt.setInt(5, Emergency.floorID); pstmt.setInt(6, Emergency.locationXY[0]); pstmt.setInt(7, Emergency.locationXY[1]); int i = pstmt.executeUpdate();//执行 pstmt 不需要 st

【讨论】:

以上是关于不允许 HSQLDB 参数标记的主要内容,如果未能解决你的问题,请参考以下文章

动态添加 XML 标记,并且不应该允许基于使用 XSLT 的 xml 中特定标记的计数重复

Java 8 javadoc doclint 功能“此处不允许标记”

HSQLDB 内存消耗

Arduino IDE:在“”标记之前不允许函数定义

是否有允许“标记”类别频道的内置不和谐功能?

只允许用户在谷歌地图上放置 1 个标记