【问题标题】:How can I use prepared statement with inner sql stament?如何将准备好的语句与内部 sql 语句一起使用?
【发布时间】:2017-07-31 16:07:22
【问题描述】:

当它被执行时,它会抛出以下异常, “您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以在 'SELECT travel_manager_id FROM travel_agency_manager WHERE user_id=(SELECT user_i' at line 1" 附近使用正确的语法”

公共类 AgencyRegistrationDAOImpl 扩展 DBConnection {

public int registerAgency(Agency agency) throws SQLException {

    int returnVal = 0;
    Connection connection = getConnection();

        if (connection != null) {

            String query = "INSERT INTO travel_agency (agency_manager_id,trade_name," +
        "company_name,address,email,city,district,tpno,web_link,description,agency_image_link,business_registration_number" +
        ",isApproved) VALUES " +
        "(SELECT travel_manager_id FROM travel_agency_manager WHERE user_id=(SELECT user_id FROM users WHERE email=?)),?,?,?,?,?,?,?,?,?,?,?,?)";


            returnVal = CRUDOperations.insertAsPreparedStmt(query, connection, agency.getUserName(), agency.getTradeName(),
                    agency.getCompanyName(),  agency.getAddress(), agency.getEmail(), agency.getCity(),
                    agency.getDistrict(), agency.getTelePhoneNumber(), agency.getWeblink(), agency.getDescription(),
                    agency.getImagePath(), agency.getRegistration(), 0);

        }

    return returnVal;
}

}

公共类 CRUDOperations {

public static int insertAsPreparedStmt(String query, Connection connection, Object... values) throws SQLException {

    PreparedStatement preparedStatement = null;
    try {

        if (connection != null) {
            preparedStatement = connection.prepareStatement(query);

            for (int index = 0; index < values.length; index++) {
                preparedStatement.setObject(index + 1, values[index]);
            }
            return preparedStatement.executeUpdate();
        }

    } finally {
        if (!connection.isClosed() && !preparedStatement.isClosed()) {
            preparedStatement.close();
            connection.close();
        }
    }
    return 0;
}

}

【问题讨论】:

  • 当您提出问题时,文本区域右侧有一个橙色的大如何格式化框,其中包含有用的信息。还有一个完整的格式化辅助工具栏。还有一个 [?] 按钮提供格式化帮助。 并且一个预览区域位于文本区域和发布您的问题按钮之间(这样您就必须滚动过去才能找到该按钮,以鼓励您查看它)显示您的帖子发布时的样子。使您的帖子清晰,并证明您花时间这样做,可以提高您获得好答案的机会。
  • 什么 T.J.说。此外,这几乎不是一个问题,只是一个代码转储。
  • 我已经为你格式化了代码并添加了一个缺失的;(因为它似乎极不可能改变问题的含义),但正如 HoneyBadger 所说,这不是一个问题。目前尚不清楚标题中的问题如何应用于问题中的代码。您已经在代码中使用了准备好的语句。
  • 您似乎未更正某人为您更正的格式。

标签: java sql jdbc prepared-statement


【解决方案1】:

您的 SQL 语法有错误

这不是正确的语法

INSERT INTO ... VALUES SELECT ....

正确的语法是

INSERT INTO ... SELECT ...

这里是mysql doc

INSERT INTO travel_agency (
            agency_manager_id,trade_name, company_name,address,email,city,district,tpno,web_link,description,agency_image_link,business_registration_number, isApproved
    ) 
    SELECT travel_manager_id,?,?,?,?,?,?,?,?,?,?,?,?
            FROM travel_agency_manager WHERE user_id=
            (
                SELECT user_id FROM users WHERE email=?
            )

【讨论】:

  • 我在声明中添加了缺失的 )。但是还是有错误,com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'SELECT travel_manager_id FROM travel_agency_manager WHERE user_id=(SELECT user_i' 附近使用正确的语法
  • @SenalWeerasinghe 请显示更正后的陈述(用它编辑您的问题)
  • @SenalWeerasinghe 它是什么数据库?我已经编辑了我的答案,因为我在发布之前没有考虑过。
  • 这是 MySQL 版本 5.1.39。
  • @SenalWeerasinghe 检查语法是否正确。当然,更新参数索引,因为电子邮件现在在末尾。
猜你喜欢
  • 2016-12-17
  • 1970-01-01
  • 2021-10-11
  • 2012-02-08
  • 2013-04-01
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多