【问题标题】:how to execute 2 queries together?如何一起执行 2 个查询?
【发布时间】:2019-08-06 14:15:10
【问题描述】:

我正在做一个项目,我想插入 2 个不同的表,所以我编写了这 2 个查询(query1,query2),当我只用一个查询运行程序时,我没有得到任何异常,但是在执行时在一起我有一堆异常,我使用了preparedStatement execute()并且没有工作 注意:我不是很有经验,请简单解释一下

private void loadBusesToDB() throws SQLException{
            Connection connection = connect();

            String query = "INSERT INTO Bus (nomLigne, Marque, Matricule, Capacite)"
                    + "VALUES (?, ?, ?, ?)";

            String query2 = "INSERT INTO Lignes (nomLigne, Sntv Depart, SNTV Arrive, prix)"
                    + "VALUES (?, ?, ?, ?)";

            PreparedStatement ps = null;
            PreparedStatement ps2 = null;
        try {

            ps = connection.prepareStatement(query);
            ps2 = connection.prepareStatement(query2);

            for(Bus bus : Bus.buses){
                ps.setString(1, bus.getNomLigne());
                ps.setString(2, bus.getMarque());
                ps.setString(3, bus.getMatricule());
                ps.setInt(4, bus.getCapacite());
                ps.addBatch();   // THE INSERT HAPPENS HERE
            }
            ps.executeBatch();


            for(Lignes ligne : Lignes.lignes){
                ps2.setString(1, ligne.getNomLigne());
                ps2.setString(2, ligne.getDepart());
                ps2.setString(3, ligne.getArrive());
                ps2.setFloat(4, ligne.getPrix());
                ps2.addBatch();   // THE INSERT HAPPENS HERE
            }
            ps2.executeBatch();

        } catch (SQLException ex) {
            ex.printStackTrace();
            System.out.println("ERROR HERE");
            throw ex;
        }finally{
            ps.close();
            ps2.close();
            connection.close();
        }
        }

错误:

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.2 用户缺少权限或找不到对象:SNTV 在 net.ucanaccess.jdbc.UcanaccessConnection.prepareStatement(UcanaccessConnection.java:509) 在 sntv.MainMenuController.loadBusesToDB(MainMenuController.java:135) 在 sntv.MainMenuController.initialize(MainMenuController.java:277) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)

【问题讨论】:

  • 错误消息似乎是某种数据库管道消息。您可以尝试一些简单的方法,例如在任一表上执行 SELECT *,看看至少是否可以正常工作?
  • 顺便说一句,我建议使用 try-with 资源,这样你就不需要在 finally 块中关闭 ps,它看起来像这样 try(PreparedStatement ps = connection.prepareStatement(query)){}(如果你在至少 Java 8)。
  • 要缩小问题范围,首先尝试插入到一个表中查看。
  • 这个INSERT INTO Lignes (nomLigne, Sntv Depart, SNTV Arrive, prix)Sntv Depart 是一个列名,还是您想为该列设置别名?如果这确实是一个带有空格的列名(从错误消息来看是这样),那么您需要引用它,例如参见this question
  • 删除第一个后,第二个是否有效?

标签: java sql database


【解决方案1】:

正如@uaraven 所指出的,第二个查询中的列名存在语法错误。在 SQL 中,任何名称中带有空格或特殊字符/符号或名称匹配保留字的标识符(包括表、列、存储过程、函数等)在任何子句中引用时都需要转义(SELECT,@987654323 @、JOINWHEREGROUP BYHAVINGORDER BY)。

现在,不同的 RDBMS 处理这种转义的方式不同。根据您的数据库考虑以下内容。 SQLite 可能是唯一包含所有的 RDBMS。

双引号(ANSI-SQL 标准)(Oracle、DB2、Postgres、RedShift、Teradata、SQLite,为某些添加了大写规则;SQL Server/MySQL 支持 with mode变化)

String query2 = "INSERT INTO Lignes (nomLigne, \"SNTV DEPART\", \"SNTV ARRIVE\", prix)"
                    + " VALUES (?, ?, ?, ?)";

方括号SQL Server、Sybase、SQLite、MS Access

String query2 = "INSERT INTO Lignes (nomLigne, [Sntv Depart], [SNTV Arrive], prix)"
                    + " VALUES (?, ?, ?, ?)";

反引号MySQL、MariaDB、Google BigQuery Standard SQL、SQLite、MS Access

String query2 = "INSERT INTO Lignes (nomLigne, `Sntv Depart`, `SNTV Arrive`, prix)"
                    + " VALUES (?, ?, ?, ?)";

【讨论】:

  • 谢谢我做了反引号,非常感谢你
  • 很高兴听到并乐于提供帮助!考虑一下 StackOverflow 的说法 thanks
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多