当前位置: 首页 > 知识库问答 >
问题:

如何一起执行2个查询?

翁建弼
2023-03-14

我在一个项目中工作,我想插入到两个不同的表中,所以我写了这两个查询(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();
        }
        }

共有1个答案

弓宏茂
2023-03-14

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

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

双引号(ANSI-SQL标准)(Oracle,DB2,Postgres,RedShift,Teradata,SQLite,添加了一些大写规则;SQL Server/MySQL支持模式更改)

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 (?, ?, ?, ?)";

Backticks(MySQL、MariaDB、Google BigQuery Standard SQL、SQLite、MS Access)

String query2 = "INSERT INTO Lignes (nomLigne, `Sntv Depart`, `SNTV Arrive`, prix)"
                    + " VALUES (?, ?, ?, ?)";
 类似资料:
  • 问题内容: 我是JDBC的新手,我正在尝试更新数据库中的2个表,因此我想在1个事务中进行操作,因此,如果一个查询失败,另一个查询也会失败。我想提供这样的行为,或者如果其中一个失败,则有机会进行回滚。 这是我的两个查询: 问题答案: 如果要自动执行多个语句,则需要使用一个事务。JDBC连接默认为“自动提交”模式,这意味着每个语句都在其自己的事务中执行。因此,您首先需要使用禁用自动提交模式。 在禁用自

  • 问题内容: 我有两个查询,如下所示: 我想一次执行两个查询。 但是,然后告诉我如何处理每个单独设置的表。实际上,在ASP.NET中,我们使用数据集来处理两个查询, 如何使用PHP / MYSQL做同样的事情? 问题答案: 更新: 显然可以通过将标志传递给。请参阅使用PHP在一条语句中执行多个SQL查询。尽管如此,任何当前的读者都应避免使用-class函数,而更喜欢PDO。 您无法使用PHP中的常规

  • 2. Shell如何执行命令 2.1. 执行交互式命令 用户在命令行输入命令后,一般情况下Shell会fork并exec该命令,但是Shell的内建命令例外,执行内建命令相当于调用Shell进程中的一个函数,并不创建新的进程。以前学过的cd、alias、umask、exit等命令即是内建命令,凡是用which命令查不到程序文件所在位置的命令都是内建命令,内建命令没有单独的man手册,要在man手册

  • 问题内容: 是否有任何查询/方式来显示 所有 服务器上执行的最后一个查询? 问题答案: 对于那些拥有MySQL> = 5.1.12的用户,可以在运行时全局控制此选项: 执行 执行 看看桌子 如果您希望输出到文件而不是表: 默认值 。 我更喜欢这种方法来编辑.cnf文件,因为: 您没有编辑文件,并可能永久打开日志记录 您不会在文件系统中四处寻找查询日志-甚至更糟的是,由于需要完美的目的地而分心。 您

  • 我正在将Flyway集成到一个现有的遗留项目中,该项目由同一个应用程序的多个数据库组成。该项目使用Maven,我想使用maven-flyway-plugin与flyway集成。 到目前为止,我的工作配置如下所示: 有了这个,我可以像这样分别迁移每个数据库: 不幸的是,这不是非常友好的用户。我希望能够简单地执行并执行所有三个迁移配置。

  • 我读过这篇文章,它说数据记录被组织成称为碎片的组,这些碎片可以被Lambda函数并行地消费和处理。我还从AWS webindar中找到了这些幻灯片,在幻灯片22中,您还可以看到Lambda函数并行使用不同的碎片。但是,我无法实现单个函数的并行执行。我创建了一个运行一分钟的简单lambda函数。然后,我开始在DynamoDB中创建大量的项目,希望获得大量的流记录。尽管如此,我的功能还是一个接一个地启